each row is sorted, start new search y index from row + 1
publicintsearchMatrix(int[][] matrix,int target) {int m =matrix.length, n = matrix[0].length;int x = m, y =0;int count =0;// search from bottom left to top rightwhile (x >=0&& y <= n){if (matrix[x][y] < target){ y++; }elseif(matrix[x][y] > target){ x--; }else{ count++; y++; x--; } }return count;
702 Search in a big sorted array with unknown size
Given an integer array sorted in ascending order, write a function to search target in nums. If target exists, then return its index, otherwise return -1. However, the array size is unknown to you. You may only access the array using an ArrayReader interface, where ArrayReader.get(k) returns the element of the array at index k (0-indexed).
publicintsearch(ArrayReader reader,int target) {int index =1;while(reader.get(index-1) < target) index *=2;int start = index/2, end = index-1;while(start+1< end){int mid = start + (end-start)/2;if(reader.get(mid) <= target) start = mid;else end = mid; }if(reader.get(start) == target) return start;if(reader.get(end) == target) return end;return-1;}
Search the insert position
One more scenario to define [1,2,3], target = 4
Use target to define return position
publicintsearchInsert(int[] A,int target) {// find first less or equal then targetif (A ==null||A.length==0){return0; }int start =0, end =A.length-1;while(start+1< end){int mid = start + (end-start)/2;if (A[mid] == target){ start = mid; }elseif (A[mid] < target){ start = mid; }else{ end = mid; } }// use target to define return positionif (target <=A[start]){return start; }elseif (target <=A[end]){return end; }else{return end +1; }}
Count of smaller number
Sort A first
Not include the target number => similar to "insertion position"
publicList<Integer>countOfSmallerNumber(int[] A,int[] queries) {List<Integer> result =newArrayList<>();if (queries ==null||queries.length==0){return result; }int lenA = A ==null?0:A.length;Arrays.sort(A);for (int i =0; i <queries.length; i++){if(lenA ==0){result.add(0); }else{result.add(binarySearch(A, queries[i])); } }return result;}privateintbinarySearch(int[] A,int target){int start =0, end =A.length-1;while(start +1< end){int mid = start + (end-start)/2;if (A[mid] == target){ end = mid; }elseif (A[mid] < target){ start = mid; }else{ end = mid; } }// not include targetif (target <=A[start]){return start; }elseif (target <=A[end]){return end; }else{return end +1; }}
658. Find K closest Elements
Given a sorted array, two integers k and x, find the k closest elements to x in the array.
A[i] to A[i+k-1]
Binary search, 利用 x 與兩邊的距離
x = 3, k =2 [1,1,2,2,2,2,2,3,3], 需特別處理 兩邊到x距離相等的情況
deffindClosestElements(self,arr: List[int],k:int,x:int) -> List[int]: l, r =0,len(arr)-kwhile l < r: mid = (l+r)//2if arr[mid]== arr[mid+k]:if x > arr[mid]: l = mid+1else: r = midelifabs(arr[mid] - x)>abs(arr[mid+k] - x): l = mid+1else: r = midreturn arr[l: r+k]