public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> s=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(!s.containsKey(target-nums[i])){
s.put(nums[i],i);
}
else return(new int[]{s.get(target-nums[i]),i});
}
return null;
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy =new ListNode();
var curr=dummy;
int hyper=0;
while(true){
if(l1==null){
break;
}
if(l2==null){
break;
}
var res=l1.val+l2.val+hyper;
hyper=(int)res/10;
l2.val=res%10;
curr.next=l2;
l1=l1.next;
l2=l2.next;
curr=curr.next;
}
while(l1!=null){
var res_solo=l1.val+hyper;
hyper=(int)res_solo/10;
l1.val=res_solo%10;
curr.next=l1;
l1=l1.next;
curr=curr.next;
}
while(l2!=null){
var res_solo2=l2.val+hyper;
hyper=(int)res_solo2/10;
l2.val=res_solo2%10;
curr.next=l2;
l2=l2.next;
curr=curr.next;
}
if(hyper>0){
ListNode last=new ListNode(hyper);
curr.next=last;
}
return dummy.next;
}
Leetcode:leetcode
Geeksforgeeks
The idea is to use window sliding
Whenever we see repetition, we remove the previous occurrence and slide the window.
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int half=(int)(nums1.length+nums2.length)/2;
int[] a,b;
if(nums1.length>nums2.length){
a=nums2;
b=nums1;
}
else{
a=nums1;
b=nums2;
}
int len_a=a.length;
int len_b=b.length;
int i;
int j;
int left=0;
int right=len_a-1;
while(true){
注意,这里python的实现代码为i(left+right)//2其效果等同于Math.floor而不是%;
i= (int)Math.floor((double)(left+right)/2)
j=half-i-2;
int left_a = i>=0 ? a[i]:Integer.MIN_VALUE;
int right_a = (i+1)<len_a ? a[i+1]:Integer.MAX_VALUE;
int left_b = j>=0? b[j]:Integer.MIN_VALUE;
int right_b = (j+1)<len_b ? b[j+1]:Integer.MAX_VALUE;
if((left_a<=right_b)&&(left_b<=right_a)){
if((len_a+len_b)%2==0){
return (double)(Math.max(left_a,left_b)+Math.min(right_b,right_a))/2;
}
else{
return (double)Math.min(right_a,right_b);
}
}
else if(left_a>right_b) {
right=i-1;
}
else{
left=i+1;
}
}
}
public String longestPalindrome(String s) {
String res_len="";
int max_len=0;
int len=s.length();
for(int i=0;i<len;i++){
int left=i,right=i;
while(left>=0&&right<len&&s.charAt(left)==s.charAt(right)){
if((right-left+1)>max_len){
max_len=right-left+1;
res_len=s.substring(left,right+1);
}
right++;
left--;
}
left=i;
right=i+1;
while(left>=0&&right<len&&s.charAt(left)==s.charAt(right)){
if((right-left+1)>max_len){
max_len=right-left+1;
res_len=s.substring(left,right+1);
}
right++;
left--;
}
}
return res_len;
}
}
注意每次到头时候的变化是-=2
或+=2
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
int i = 0;
int j = 0;
String[] res = new String[numRows];
Arrays.fill(res,"");
while (i < s.length()) {
while (j < numRows) {
if (i >= s.length()) {
break;
}
res[j] += s.charAt(i);
i++;
j++;
}
j-=2;
while (j >= 0) {
if (i >= s.length()) {
break;
}
res[j] += s.charAt(i);
i++;
j--;
}
j+=2;
}
StringBuilder resString = new StringBuilder();
for (String ss : res) {
resString.append(ss);
}
return resString.toString();
}
public int reverse(int x) {
if (x == 0) {
return 0;
}
boolean minus = x > 0 ? false : true;
x = Math.abs(x);
String original = Integer.valueOf(x).toString();
String reversedString = new StringBuffer(original).reverse().toString();
String MAX_INT = String.valueOf(Integer.MAX_VALUE);
String MIN_INT = String.valueOf(Integer.MIN_VALUE);
int startIdx = 0;
if (reversedString.charAt(startIdx) == '0') {
reversedString = reversedString.replace("^0+", "");
if (minus) {
reversedString = "-" + reversedString;
}
return Integer.parseInt(reversedString);
}
if (minus) {
reversedString = "-" + reversedString;
if(reversedString.length()<MIN_INT.length()){
return Integer.parseInt(reversedString);
}
startIdx = 1;
for (int i = startIdx; i < reversedString.length(); i++) {
if (reversedString.charAt(i) < MIN_INT.charAt(i)) {
return Integer.parseInt(reversedString);
} else if (reversedString.charAt(i) > MIN_INT.charAt(i)) {
return 0;
}
}
}
if(reversedString.length()<MAX_INT.length()){
return Integer.parseInt(reversedString);
}
for (int i = startIdx; i < reversedString.length(); i++) {
if (reversedString.charAt(i) < MAX_INT.charAt(i)) {
return Integer.parseInt(reversedString);
} else if (reversedString.charAt(i) > MAX_INT.charAt(i)) {
return 0;
}
}
return 0;
}
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.math.BigInteger;
class Solution {
public int myAtoi(String s) {
String regex="^\\s*[\\+\\-]?\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher=pattern.matcher(s);
if(matcher.find()==true){
BigInteger currVal=new BigInteger(matcher.group().strip());
BigInteger maxInt = new BigInteger(String.valueOf(Integer.MAX_VALUE));
BigInteger minInt=new BigInteger(String.valueOf(Integer.MIN_VALUE));
if(currVal.compareTo(maxInt)>0){
return Integer.MAX_VALUE;
}
if(currVal.compareTo(minInt)<0){
return Integer.MIN_VALUE;
}
System.out.println(matcher.group());
System.out.println("true");
return Integer.valueOf(matcher.group().strip());
}
else{
System.out.println(" false result");
return Integer.valueOf(0);
}
}
}
public boolean isPalindrome(int x) {
if(x<0){
return false;
}
String nums=String.valueOf(x);
int start=0;
int end=nums.length()-1;
while (start<end){
if(nums.charAt(start)!=nums.charAt(end)){
return false;
}
start++;
end--;
}
return true;
}
public boolean isPalindrome(int x) {
if(x<0){
return false;
}
if(x==0){
return true;
}
if(x%10==0){
return false;
}
long x_long =(long)x;
long div=1;
while (x_long>=10*div){
div*=10;
}
while (x_long>0){
long right = x_long%10;
long left= x_long/div;
if(left!=right){
return false;
}
x_long=x_long%div/10;
div/=100;
}
return true;
}
class Solution {
public static String curr_S;
public static String curr_P;
public boolean isMatch(String s, String p) {
curr_S=s;
curr_P=p;
return bfs(0,0);
}
public boolean bfs(int i,int j){
if(i>=curr_S.length()&&j>=curr_P.length()){
return true;
}
if(j>=curr_P.length()){
return false;
}
//与或运算优先级相同
var match=i<curr_S.length()&&(curr_S.charAt(i)==curr_P.charAt(j)||curr_P.charAt(j)=='.');
if(j+1<curr_P.length()&&curr_P.charAt(j+1)=='*'){
return bfs(i,j+2) // 不使用*符号
|| (match&&bfs(i+1,j)); //使用*符号
}
if(match){
return bfs(i+1,j+1);
}
return false;
}
}
public int maxArea(int[] height) {
Deque<Integer> monotonic=new LinkedList<>();
Deque<Integer> reverseMonotomic=new LinkedList<>();
int i=0;
while (i<height.length){
while (!monotonic.isEmpty()&&i<height.length&&height[monotonic.peekLast()]>=height[i]){
i++;
}
if(i>=height.length){
break;
}
monotonic.addLast(i);
i++;
}
int j=height.length-1;
while (j>=0){
while (!reverseMonotomic.isEmpty()&&j>=0&&height[reverseMonotomic.peekLast()]>=height[j]){
j--;
}
if(j<0){
break;
}
reverseMonotomic.addLast(j);
j--;
}
int maxVolume=0;
for(int l:monotonic){
for(int r:reverseMonotomic){
maxVolume=Math.max(Math.min(height[l],height[r])*(r-l),maxVolume);
}
}
return maxVolume;
}
public int maxArea(int[] height) {
int maxVolume=0;
int left=0;
int right=height.length-1;
while (left<right){
maxVolume=Math.max(maxVolume,Math.min(height[left],height[right])*(right-left));
if(height[left]>height[right]){
right--;
}
else{
left++;
}
}
return maxVolume;
}
class Solution {
public static final LinkedHashMap<Integer,String> alphabet=initAlphabet();
public static final List<Integer> listKeys = new ArrayList<Integer>(alphabet.keySet());
private static LinkedHashMap<Integer, String> initAlphabet() {
LinkedHashMap<Integer, String> alphabet=new LinkedHashMap<>();
alphabet.put(1,"I");
alphabet.put(4,"IV");
alphabet.put(5,"V");
alphabet.put(9,"IX");
alphabet.put(10,"X");
alphabet.put(40,"XL");
alphabet.put(50,"L");
alphabet.put(90,"XC");
alphabet.put(100,"C");
alphabet.put(400,"CD");
alphabet.put(500,"D");
alphabet.put(900,"CM");
alphabet.put(1000,"M");
return alphabet;
}
public String intToRoman(int num) {
StringBuilder res=new StringBuilder();
for (int i=listKeys.size()-1;i>=0;i--){
int val=listKeys.get(i);
if(num/val>0){
var count=num/val;
res.append(alphabet.get(val).repeat(num/val));
num=num%val;
}
}
return res.toString();
}
}
public int romanToInt(String s) {
int curr=0;
HashMap<String,Integer> dict=new HashMap<>();
dict.put("I",1);
dict.put("V",5);
dict.put("X",10);
dict.put("L",50);
dict.put("C",100);
dict.put("D",500);
dict.put("M",1000);
dict.put("IV",4);
dict.put("IX",9);
dict.put("XL",40);
dict.put("XC",90);
dict.put("CD",400);
dict.put("CM",900);
String prev="";
int res=0;
while (curr<s.length()){
prev+=s.charAt(curr);
if (dict.containsKey(prev)){
}
else{
res+=dict.get(prev.substring(0,prev.length()-1));
prev= String.valueOf(s.charAt(curr));
}
curr++;
}
if (dict.containsKey(prev)){
res+=dict.get(prev);
}
return res;
}
public String longestCommonPrefix(String[] strs) {
int i=0;
int strCounts=strs.length;
int maxLen= Arrays.stream(strs).mapToInt(String::length).sorted().findFirst().orElse(-1);
int res=0;
while (i != maxLen) {
for (int s = 1; s < strCounts; s++) {
if (strs[s].charAt(i) != strs[s - 1].charAt(i)) {
return strs[0].substring(0, res);
}
}
res++;
i++;
}
return strs[0].substring(0,res);
}
Geeksforgeeks
By Sorting the array the efficiency of the algorithm can be improved. This efficient approach uses the two-pointer technique
. Traverse the array and fix the first element of the triplet. Now use the Two Pointers algorithm to find if there is a pair whose sum is equal to x – array[i]. Two pointers algorithm take linear time so it is better than a nested loop.
Hashing
Geeksforgeeks
This involves traversing through the array. For every element arr[i]
, find a pair with sum “-arr[i]”
. This problem reduces to pair sum and can be solved in O(n) time using hashing.
Hashmap
to store a key-value pair. public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int res=0;
int curr_Closest=Integer.MAX_VALUE;
for(int i=0;i<nums.length-2;i++){
int curr_target=target-nums[i];
int left=i+1;
int right=nums.length-1;
while (left<right){
int gap=curr_target-nums[left]-nums[right];
if (Math.abs(gap)<Math.abs(curr_Closest)){
curr_Closest=gap;
res=nums[i]+nums[left]+nums[right];
}
if (gap<0){
right--;
}
else {
left++;
}
}
}
return res;
}
public static final HashMap<Integer,List<Character>> PHONE_ALPHA=initPhoneAlpha();
public static List<String> res=new ArrayList<>();
private static HashMap<Integer, List<Character>> initPhoneAlpha() {
HashMap<Integer, List<Character>> phoneAlpha=new HashMap<>();
phoneAlpha.put(2,List.of('a','b','c'));
phoneAlpha.put(3,List.of('d','e','f'));
phoneAlpha.put(4,List.of('g','h','i'));
phoneAlpha.put(5,List.of('j','k','l'));
phoneAlpha.put(6,List.of('m','n','o'));
phoneAlpha.put(7,List.of('p','q','r','s'));
phoneAlpha.put(8,List.of('t','u','v'));
phoneAlpha.put(9,List.of('w','x','y','z'));
return phoneAlpha;
}
public List<String> letterCombinations(String digits) {
res.clear();
if(digits.isEmpty()){
return res;
}
backTrack(digits,0,new ArrayList<>());
return res;
}
public void backTrack(String digits,int idx,ArrayList<Character> currRes){
if(idx==digits.length()){
res.add(currRes.stream().map(String::valueOf).collect(Collectors.joining()));
return;
}
int num=Character.getNumericValue(digits.charAt(idx));
for (Character c:PHONE_ALPHA.get(num)){
currRes.add(c);
backTrack(digits,idx+1,currRes);
currRes.remove(currRes.size()-1);
}
}
class Solution {
public static List<List<Integer>> res=new ArrayList<>();
public List<List<Integer>> fourSum(int[] nums, int target) {
res.clear();
Arrays.sort(nums);
long long_target=(long) target;
kSum(4,0,target,nums,new Stack<>());
return res;
}
public void kSum(int k,int start,long target,int[] nums,Stack<Integer> quad){
if (k>2){
for(int i=start;i+k<=nums.length;i++){
if(i>start&&nums[i]==nums[i-1]){
continue;
}
quad.push(nums[i]);
kSum(k-1,i+1,target-nums[i],nums,quad);
quad.pop();
}
return;
}
int left=start,right=nums.length-1;
while(left<right){
long sum=nums[left]+nums[right];
if(sum<(long)target){
left++;
}
else if(sum>target){
right--;
}
else{
var currRes= new ArrayList<>(quad.stream().toList());
currRes.add(nums[left]);
currRes.add(nums[right]);
res.add(currRes);
left++;
while (left<right&&nums[left]==nums[left-1]){
left++;
}
}
}
}
}
public ListNode removeNthFromEnd(ListNode head, int n) {
var fast=head;
var curr=head;
ListNode dummy=new ListNode();
dummy.next=head;
ListNode prev=null;
if(head.next==null){
return null;
}
for (int i=0;i<n;i++){
fast=fast.next;
}
if(fast==null){
return dummy.next.next;
}
System.out.println(fast.val);
while(fast!=null){
prev=curr;
fast=fast.next;
curr=curr.next;
}
System.out.println(prev.val);
prev.next=prev.next.next;
return dummy.next;
}
class Solution {
public boolean isValid(String s) {
Stack<Character> parenthesis=new Stack<Character>();
if(s==null||s.isEmpty()){
return true;
}
parenthesis.push(s.charAt(0));
for (int j=1;j<s.length();j++){
if(parenthesis.isEmpty()){
parenthesis.push(s.charAt(j));
continue;
}
var top=parenthesis.peek();
if (match(top,s.charAt(j))){
parenthesis.pop();
}
else{
parenthesis.push(s.charAt(j));
}
}
return parenthesis.isEmpty();
}
public boolean match(char p,char q){
switch (p){
case '(':
if (q!=')')
{
return false;
}
else return true;
case '{':
if (q!='}')
{
return false;
}
else return true;
case '[':
if (q!=']')
{
return false;
}
else return true;
}
return false;
}
}
Geeksforgeeks
Leetcode:Generate Parentheses
public List<String> generateParenthesis(int n) {
Stack<Character> charStack =new Stack<>();
List<String> res=new ArrayList<>();
backtrack(charStack,res,0,0,n);
return res;
}
public void backtrack(Stack<Character> charStack,List<String> res,int leftCount,int rightCount,int n){
if(leftCount==rightCount&&rightCount==n){
String resString = Arrays.stream(charStack.toArray(Character[]::new))
.map(ch -> ch.toString())
.collect(Collectors.joining());
res.add(resString);
return;
}
if(leftCount<n){
charStack.push('(');
backtrack(charStack,res,leftCount+1,rightCount,n);
charStack.pop();
}
if(rightCount<leftCount){
charStack.push(')');
backtrack(charStack,res,leftCount,rightCount+1,n);
charStack.pop();
}
}
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0){
return null;
}
List<ListNode> convertedList=Arrays.asList(lists);
// System.out.println("converted "+convertedList.get(1));
while(convertedList.size()>1){
List<ListNode> mergedList=new ArrayList<>();
for(int i=0;i<convertedList.size();i+=2){
ListNode l1=convertedList.get(i);
ListNode l2;
if(i+1<convertedList.size()){
l2=convertedList.get(i+1);
}
else {
l2=null;
}
System.out.print("l1 "+l1+" l2 "+l2);
System.out.println();
ListNode res=mergeList(l1,l2);
System.out.println("res "+res);
mergedList.add(res);
}
System.out.println(mergedList.size());
System.out.println(mergedList.get(0));
convertedList=mergedList;
}
return convertedList.get(0);
}
public ListNode mergeList (ListNode l1,ListNode l2){
ListNode dummy = new ListNode();
ListNode tail= dummy;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
tail.next=l1;
l1=l1.next;
tail=tail.next;
}
else{
tail.next=l2;
l2=l2.next;
tail=tail.next;
}
}
if(l1!=null){
tail.next=l1;
}
if(l2!=null){
tail.next=l2;
}
return dummy.next;
}
}
public ListNode swapPairs(ListNode head) {
ListNode dummy=new ListNode();
dummy.next=head;
ListNode prev=dummy;
ListNode curr=head;
while(curr!=null&&curr.next!=null){
// preserve the next pairs
ListNode nextPair=curr.next.next;
// swap
ListNode second=curr.next;
second.next=curr;
curr.next=nextPair;
prev.next=second;
// change to the next pair
prev=curr;
curr=nextPair;
}
return dummy.next;
}
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode groupPrev=dummy;
while (true){
ListNode kth=getKthNode(groupPrev,k);
if(kth==null){
break;
}
ListNode groupNext=kth.next;
ListNode prev=kth.next;
ListNode curr=groupPrev.next;
while (curr!=groupNext){
ListNode next=curr.next;
curr.next=prev;
prev=curr;
curr=next;
}
ListNode tmp=groupPrev.next;
groupPrev.next=kth;
groupPrev=tmp;
}
return dummy.next;
}
public ListNode getKthNode(ListNode head,int k){
while (head!=null&&k>0){
head=head.next;
k--;
}
return head;
}
public int removeDuplicates(int[] nums) {
int i = 1;
int j = 1;
while (j < nums.length) {
if (nums[j] != nums[i - 1]) {
var temp = nums[i];
nums[i] = nums[j];
nums[j] = nums[i];
i++;
j++;
} else {
j++;
}
}
return i;
}
public int removeElement(int[] nums, int val) {
int left=0;
int right=nums.length-1;
while (left<=right){
if (nums[left]==val){
int tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
right--;
}
else {
left++;
}
}
return left;
}
class Solution {
public int strStr(String haystack, String needle) {
return SundaySearchAlgorithm(haystack.toCharArray(), needle.toCharArray());
}
public int SundaySearchAlgorithm(char[] haystack, char[] needle) {
HashMap<Character, Integer> offset = new HashMap<>();
for (int i = 0; i < needle.length; i++) {
offset.put(needle[i], needle.length - i);
}
int curr = 0;
String target = new String(needle);
while (curr + needle.length <= haystack.length) {
String sub = new String(haystack, curr, needle.length);
if (sub.equals(target)) {
return curr;
} else {
if (curr+ needle.length>=haystack.length){
return -1;
}
if (!offset.containsKey(haystack[curr + needle.length])) {
curr = curr + needle.length ;
}
else {
curr =curr+offset.get(haystack[curr + needle.length]);
}
}
}
return -1;
}
}
public List<Integer> findSubstring(String s, String[] words) {
HashMap<String,Integer>alphabet=new HashMap<>();
List<Integer> res=new ArrayList<>();
for (var word:words){
alphabet.put(word,alphabet.getOrDefault(word,0)+1);
}
int single_word_length=words[0].length();
int words_count=words.length;
for (int i=0;i+single_word_length<=s.length();i++){
int frequency= words_count;
HashMap<String,Integer> curr_alphabet= (HashMap<String, Integer>) alphabet.clone();
for(int j=i;j+single_word_length<=s.length();j+=single_word_length){
var word=s.substring(j,j+single_word_length);
if(!curr_alphabet.containsKey(word)||curr_alphabet.get(word)==0){
break;
}
frequency--;
if(frequency==0){
res.add(i);
break;
}
curr_alphabet.put(word,curr_alphabet.get(word)-1);
}
}
return res;
}
This is a variation of the standard problem: “Counting the number of connected components in an undirected graph”
运用DFS,将所有有1的岛屿缩小的大小为1
Follow the steps below to solve the problem:
count = 0
, to store the answer.DFS
function
DFS
on the neighbor recursively public String reverseWords(String s) {
String[] splitedStrings=s.split("\\s+");
String res="";
for(int i=splitedStrings.length-1;i>=0;i--){
res=res+splitedStrings[i]+" ";
}
return res.strip();
}
public int maxProduct(int[] nums) {
int res = Arrays.stream(nums).max().getAsInt();
int min=1;
int max=1;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
min=1;
max=1;
continue;
}
int tmp_max=max*nums[i];
int tmp_min=min*nums[i];
max=Math.max(Math.max(tmp_max,tmp_min),nums[i]);
min=Math.min(Math.min(tmp_max,tmp_min),nums[i]);
res=Math.max(res,max);
}
return res;
}
public int findMin(int[] nums) {
int left=0;
int right=nums.length-1;
int mid;
if(nums[left]<=nums[right]){
return nums[left];
}
while(left<right){
mid=(left+right)>>1;
if(mid-1>=0&&nums[mid-1]>nums[mid]){
return nums[mid];
}
if(mid+1<nums.length&&nums[mid]>nums[mid+1]){
return nums[mid+1];
}
if(nums[mid]<nums[right]){
right=mid+1;
}
else{
left=mid+1;
}
}
return -1;
}
class MinStack {
public Stack<Integer> valueStack=new Stack<>();
public Stack<Integer> minValueStack=new Stack<>();
public MinStack() {
}
public void push(int val) {
valueStack.push(val);
if(minValueStack.isEmpty()){
minValueStack.push(val);
}
else{
minValueStack.push(Math.min(val,minValueStack.peek()));
}
}
public void pop() {
valueStack.pop();
minValueStack.pop();
}
public int top() {
return valueStack.peek();
}
public int getMin() {
return minValueStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
public int findPeakElement(int[] nums) {
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
for(int n:nums){
maxHeap.offer(n);
}
return IntStream.range(0,nums.length).filter(i->nums[i]==maxHeap.peek()).findFirst().orElse(-1);
}
Using Binary Search, check if the middle element is the peak element or not. If the middle element is not the peak element, then check if the element on the right side is greater than the middle element then there is always a peak element on the right side. If the element on the left side is greater than the middle element then there is always a peak element on the left side.
public int findPeakElement(int[] nums) {
if(nums.length==1){
return 0;
}
if(nums.length==2){
if(nums[0]>nums[1]){
return 0;
}
else{
return 1;
}
}
int leftMost=0;
int rightMost=nums.length-1;
int left=0;
int right=nums.length-1;
int mid=0;
int greatest;
while(left<=right){
mid=(left+right)>>1;
if(mid==rightMost){
if(nums[mid]>nums[mid-1]){
return mid;
}
else{
return mid-1;
}
}
if(mid==leftMost){
if(nums[mid]>nums[mid+1]){
return mid;
}
else{
return mid+1;
}
}
greatest=Math.max(Math.max(nums[mid-1],nums[mid+1]),nums[mid]);
if(greatest==nums[mid]){
return mid;
}
else if(greatest==nums[mid+1]){
left=mid+1;
}
else{
right=mid-1;
}
}
System.out.println(left);
if(left==0){
return 0;
}
return nums.length-1;
}
public int compareVersion(String version1, String version2) {
String[] spiltedVersion1=version1.split("\\.");
String[] spiltedVersion2=version2.split("\\.");
int minLength=Math.min(spiltedVersion1.length,spiltedVersion2.length);
for(int i=0;i<minLength;i++){
if(Float.parseFloat(spiltedVersion1[i])>Float.parseFloat(spiltedVersion2[i])){
return 1;
}
else if(Float.parseFloat(spiltedVersion1[i])<Float.parseFloat(spiltedVersion2[i])){
return -1;
}
}
if(spiltedVersion1.length==spiltedVersion2.length){
return 0;
}
else if(spiltedVersion1.length>spiltedVersion2.length){
for(int i=minLength;i<spiltedVersion1.length;i++){
if(Float.parseFloat(spiltedVersion1[i])>0){
return 1;
}
}
return 0;
}
else {
for(int i=minLength;i<spiltedVersion2.length;i++){
if(Float.parseFloat(spiltedVersion2[i])>0){
return -1;
}
}
return 0;
}
}
public String convertToTitle(int columnNumber) {
StringBuilder res = new StringBuilder();
int extraCarry=0;
while (columnNumber >26) {
char residual_char = (char) ('A'+ (columnNumber-1) % 26);
extraCarry=0;
if(columnNumber%26==0){
extraCarry=1;
}
columnNumber=columnNumber/26-extraCarry;
res.append(residual_char);
}
char residual_char= (char) ('A'+(columnNumber-1)%26);
res.append(residual_char);
return res.reverse().toString();
}
public int majorityElement(int[] nums) {
int count=0;
int currentMajority=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]!=currentMajority){
if(count==0){
currentMajority=nums[i];
count=1;
}
else{
count--;
}
}
else{
count++;
}
}
return currentMajority;
}
public String largestNumber(int[] nums) {
String res= Arrays.stream(nums).boxed().sorted((n1,n2)->{
String s1 =n1.toString();
String s2 =n2.toString();
String res1=s1+s2;
String res2=s2+s1;
for(int i=0;i<res1.length();i++){
if(res1.charAt(i)>res2.charAt(i)){
return -1;
}
else if (res1.charAt(i)<res2.charAt(i)){
return 1;
}
}
return -1;
}).map(Object::toString).collect(Collectors.joining());
res=res.replaceAll("^0+(.+)","$1");
return res;
}
class Solution {
public void rotate(int[] nums, int k) {
k=k%nums.length;
if(k==0){
return;
}
reverse(nums,0,nums.length-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length-1);
}
public void reverse(int[] nums,int begin,int end){
while (begin<end){
int tmp=nums[begin];
nums[begin]=nums[end];
nums[end]=tmp;
end--;
begin++;
}
}
}
youtube(强烈推荐查看neetcode讲解)
public int rob(int[] nums) {
int rob1=0;
int rob2=0;
int tmp=0;
// [rob1,rob2,n,n+1...]
for(int n:nums){
tmp=Math.max(n+rob1,rob2);
rob1=rob2;
rob2=tmp;
}
return tmp;
}
class Solution {
public static List<Integer> res=new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
res.clear();
rightViewImpl(root);
return res;
}
public void rightViewImpl(TreeNode root){
if(root==null){
return ;
}
Queue<TreeNode> tmp1=new LinkedList<>();
int last=0;
tmp1.add(root);
while(tmp1.size()>0){
Queue<TreeNode> tmp2=new LinkedList<>();
while(tmp1.size()>0){
TreeNode node=tmp1.poll();
last=node.val;
if(node.left!=null){
tmp2.add(node.left);
}
if(node.right!=null){
tmp2.add(node.right);
}
}
tmp1.clear();
res.add(last);
tmp1.addAll(tmp2);
}
}
}
public String addStrings(String num1, String num2) {
String res="";
int carrying=0;
String n1;
String n2;
// keep n1 longgest
if(num2.length()>num1.length()){
n1=num2;
n2=num1;
}
else{
n1=num1;
n2=num2;
}
for(int i=n1.length()-1,j=n2.length()-1;j>=0;j--,i--){
int resInt=Character.getNumericValue(n1.charAt(i))+Character.getNumericValue(n2.charAt(j))+carrying;
carrying=resInt/10;
res=resInt%10+res;
}
for(int i=n1.length()-n2.length()-1;i>=0;i--){
int resInt =Character.getNumericValue(n1.charAt(i))+carrying;
carrying=resInt/10;
res=resInt%10+res;
}
if(carrying>0){
return"1"+res;
}
return res;
}
/**
* The rand7() API is already defined in the parent class SolBase.
* public int rand7();
* @return a random integer in the range 1 to 7
*/
class Solution extends SolBase {
public int rand10() {
int rand=(rand7()-1)*7+rand7();
while(rand>40){
rand=(rand7()-1)*7+rand7();
}
return rand%10+1;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = in.nextInt();
int d = in.nextInt();
Integer[] distances = new Integer[n];
distances[0] = in.nextInt();
distances[1] = in.nextInt();
long res = 0;
for (int i = 2, j = 0; i < n; i++) {
distances[i] = in.nextInt();
while (distances[i] - distances[j] > d) {
j++;
}
res += (long)(i - j) * (i - j - 1) / 2;
res = res % 99997867;
}
System.out.print(res);
}
public void sortColors(int[] nums) {
int zeros=0;
int ones=0;
int twos=0;
for(int num :nums){
switch(num){
case 0 -> zeros++;
case 1 -> ones++;
case 2 -> twos++;
}
}
for(int i=0;i<nums.length;i++){
if(zeros>0){
nums[i]=0;
zeros--;
}
else if(ones>0){
nums[i]=1;
ones--;
}
else{
nums[i]=2;
}
}
}
public void sortColors(int[] nums) {
int left=0,i=0,right=nums.length-1;
int temp;
while(i<=right){
if(nums[i]==0){
temp=nums[i];
nums[i]=nums[left];
nums[left]=temp;
left++;
}
else if(nums[i]==2){
temp=nums[right];
nums[right]=nums[i];
nums[i]=temp;
right--;
i--;
}
i++;
}
}
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode sortLinkedList (ListNode head) {
ListNode[] departed = departLinkedList(head);
ListNode assending = departed[0];
ListNode desending = departed[1];
ListNode reversedDesending = reverse(desending);
// write code here
return merge(assending,reversedDesending);
}
public ListNode[] departLinkedList(ListNode head) {
ListNode listA = head;
ListNode listACurr = listA;
ListNode listB = head.next;
ListNode listBCurr = listB;
ListNode curr = listB;
if (listB != null) {
curr = listB.next;
} else {
return new ListNode[] {head, null};
}
while (curr != null) {
listACurr.next = curr;
listACurr = listACurr.next;
curr = curr.next;
if (curr == null) {
listBCurr.next = null;
break;
} else {
listBCurr.next = curr;
listBCurr = listBCurr.next;
curr = curr.next;
}
}
listACurr.next = null;
return new ListNode[] {listA, listB};
}
public ListNode reverse(ListNode head) {
ListNode curr = head;
ListNode prev = null;
ListNode next;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
public ListNode merge(ListNode headA, ListNode headB) {
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (headA != null && headB != null) {
if (headA.val < headB.val) {
tail.next = headA;
headA = headA.next;
tail = tail.next;
} else {
tail.next = headB;
headB = headB.next;
tail = tail.next;
}
}
if (headA != null) {
tail.next = headA;
}
if (headB != null) {
tail.next = headB;
}
return dummy.next;
}
}
public int circle (int n) {
int length = 10;
int[][] dp = new int[n + 1][length];
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < length; j++) {
dp[i][j] = dp[i - 1][(j - 1 + length) % length] % 1000000007 + dp[i - 1][(j + 1)
% length] % 1000000007;
}
}
return dp[n][0] % 1000000007;
}
class Solution:
def thirtysixAdd(self, A: str, B: str) -> str:
i = max(len(A), len(B)) - 1
idx_a = len(A) - 1
idx_b = len(B) - 1
carry = 0
res_str = list()
while i >= 0:
val_A = self.char_2_int(A[idx_a]) if idx_a >= 0 else 0
val_B = self.char_2_int(B[idx_b]) if idx_b >= 0 else 0
res = carry + val_A + val_B
residual = res % 36
carry = res // 36
i -= 1
idx_a -= 1
idx_b -= 1
# write code here
res_str.append(self.int_2_char(residual))
if carry:
res_str.append("1")
res_str.reverse()
return "".join(res_str)
@staticmethod
def char_2_int(ch) -> int:
if ord(ch) > ord("9"):
return 10 + ord(ch) - ord("a")
else:
return ord(ch) - ord("0")
@staticmethod
def int_2_char(int_num) -> str:
if int_num <= 9:
return str(int_num)
else:
return chr(int_num - 10 + ord("a"))