二分查找
在有序数组中先肯定目标元素所在的区间,而后逐步缩小查找范围,直到找到或找不到目标元素。数组
int binarySearch(int[] nums, int tar) { int low = 0, high=nums.length; while(low<=high) { int mid = low+(high-low)/2; if(nums[mid]==cur) return mid; else if(nums[mid]>cur) high = mid - 1; else low = mid + 1; } return -1; }
二分查找扩展
1) 在一个有重复元素的数组中查找元素的最左位置。
须要判断返回值 low: 若该位置元素等于目标元素则 low 是最左位置,不然 low 是目标元素的插入位置。code
int binarySearch(int[] nums, int target) { int low=0, high=nums.length-1; while(low<high) { int mid=low+(high-low)/2; if(target<=nums[mid]) high=mid; else low =mid-1; } return low; }
2) 在一个有重复元素的数组中查找元素的最右位置
须要判断返回值 low: 若该位置元素等于目标元素则 low 是最左位置,不然 low+1 是目标元素的插入位置。get
int binarySearchRight(int[] nums, int target) { int low=0, high=nums.length-1; while(low<high) { int mid=low+(high-low)/2; if(target>=nums[mid]) low =mid; else high=mid-1; } return low; }
3) 二维数组中查找元素
在从左到右、从上到下递增的二维数组中查找一个元素:从右上角的元素开始比较,大于target则行+1,不然列-1扩展
boolean find(int[][] nums, int target) { if(nums==null || nums.length==0 || nums[0].length==0) { return false; } int row=0, col=nums[0].length-1; while(row<nums.length && col>=0) { if(nums[row][col]==target) { return true; } else if(nums[row][col]<target) { row++; } else { col--; } } return false; }