最好还是自己想
寻找一个数
int binarySearch(int[] nums, int target) {int left = 0;int right = nums.length - 1; // 注意while(left < right) {int mid = left + (right - left) / 2;if(nums[mid] == target)return mid;else if (nums[mid] < target)left = mid + 1; // 注意else if (nums[mid] > target)right = mid; // 注意}return -1;}
寻找左侧边界
public int leftBound(int[] nums, int target){if(nums.length==0) return -1;int l=0;int r=nums.length-1;while(l<=r){int mid=l+(r-l)/2;if(nums[mid]<target){l=mid+1;}else if(nums[mid]>target){r=mid-1;}else{r=mid-1;}}if(l<0||nums[l]!=target) return -1;return l;}
寻找右侧边界
public int rightBound(int[] nums, int target){if(nums.length==0) return -1;int l=0;int r=nums.length-1;while(l<=r){int mid=l+(r-l)/2;if(nums[mid]<target){l=mid+1;}else if(nums[mid]>target){r=mid-1;}else{l=mid+1;}}if(r<0||nums[r]!=target) return -1;return r;}
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I
找到最左侧下标,向右遍历
注意需要判断返回的下标是否符合要求
比如:
[5,7,7,8,8,10]
6
返回的index=1,但实际上nums[1]=7,不等于6
class Solution {public int search(int[] nums, int target) {int l=0, r=nums.length-1;while(l<r){int mid=l+(r-l)/2;if(nums[mid]>target){r=mid-1;}else if(nums[mid]<target){l=mid+1;}else{r=mid;}}int count=0;for(int i=l;i<nums.length;i++){if(nums[i]==target) count++;else break;}return count;}}
