二分查找
在有序數組中先肯定目標元素所在的區間,而後逐步縮小查找範圍,直到找到或找不到目標元素。數組
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; }