classSolution{ publicintGetNumberOfK(int [] array , int k){ int head = getHead(array, k); int tail = getTail(array, k); if (head != -1 && tail != -1) return tail - head + 1; elsereturn0; }
publicintgetHead(int[] array, int k){ int left = 0, right = array.length-1; while (left <= right) { int mid = (left + right) / 2 ; if (array[mid] < k) left = mid+1; elseif (array[mid] > k) right = mid-1; elseif (mid-1 >= 0 && array[mid-1] == k) right = mid-1; elsereturn mid; } return -1; }
publicintgetTail(int[] array, int k){ int left = 0, right = array.length-1; while (left <= right) { int mid = (left + right) / 2 ; if (array[mid] < k) left = mid+1; elseif (array[mid] > k) right = mid-1; elseif (mid+1 < array.length && array[mid+1] == k) left = mid+1; elsereturn mid; } return -1; } }
0~n-1中缺失的数字
思路:二分查找,查找第一个数值和下标不相等的元素的下标。
1 2 3 4 5 6 7 8 9 10 11
classSolution{ publicintmissingNumber(int[] nums){ int left = 0, right = nums.length-1; while (left<=right) { int mid = left+(right-left)/2; if (nums[mid]==mid) left = mid+1; else right = mid-1; } return left; } }
publicintgetDepth(TreeNode root){ if (root==null) return0; int left = getDepth(root.left); if (left==-1) return -1; int right = getDepth(root.right); if (right==-1) return -1; if (Math.abs(left-right)>1) return -1; return1+Math.max(left, right); } }
publicclassSolution{ public String ReverseSentence(String str){ char[] chars= str.toCharArray(); int n = chars.length; Reverse(chars, 0, n-1); int i = 0, j = 0; while (j<=n) { if (j==n || chars[j]==' ') { Reverse(chars, i, j-1); i = j+1; } j++; } returnnew String(chars); }
publicvoidReverse(char[] str, int start, int end){ while (start<end) { char temp = str[start]; str[start]= str[end]; str[end] = temp; start++; end--; } } }
publicclassSolution{ public String LeftRotateString(String str, int n){ char[] strs = str.toCharArray(); int len = strs.length; if (len<1) return str; int k = n % len; if (k==0) return str; reverseString(strs, 0, len-1); reverseString(strs, 0, len-1-k); reverseString(strs, len-k, len-1); return String.valueOf(strs); }
publicvoidreverseString(char[] str, int i, int j){ while (i<j) { char temp = str[i]; str[i++] = str[j]; str[j--] = temp; } } }
classSolution{ publicbooleanisStraight(int[] nums){ HashSet<Integer> set = new HashSet<>(); int min = 14, max = 0, count = 0; for (int num: nums) { if (num!=0) { if (set.contains(num)) returnfalse; set.add(num); min = Math.min(min, num); max = Math.max(max, num); } else count++; } return max-min<=4; } }
classSolution{ publicintlastRemaining(int n, int m){ int index = 0; for (int i=2; i<=n; i++) { index = (index+m)%i; } return index; } }
也可以使用数组或链表来模拟游戏过程。
1 2 3 4 5 6 7 8 9 10 11 12
classSolution{ publicintlastRemaining(int n, int m){ ArrayList<Integer> list = new ArrayList<>(); for (int i=0; i<n; i++) list.add(i); int index = 0; while (list.size()>1) { index = (index+m-1)%list.size(); list.remove(index); } return list.get(0); } }
股票的最大利润
思路:用一个数保存之前遍历过的最小的数,每日所获得的最大利润等于当日股价减去这个最小值。
1 2 3 4 5 6 7 8 9 10 11 12
classSolution{ publicintmaxProfit(int[] prices){ if (prices.length < 2) return0; int min = prices[0]; int maxDiff = Math.max(prices[1] - min, 0); for (int i=2; i<prices.length; i++) { if (prices[i-1] < min) min = prices[i-1]; if (prices[i] - min > maxDiff) maxDiff = prices[i] - min; } return maxDiff; } }