1 class Solution { 2 public: 3 bool Find(int target, vector<vector<int> > array) { 4 bool findTarget = 0; 5 6 for(int i=0; i<array.size(); i++){ 7 int low = 0; 8 int len = array[i].size(); 9 int high = len - 1; 10 11 while(low <= high){ 12 int mid = low + ((high - low)>>1); 13 if( target == array[i][mid]){ 14 findTarget = 1; 15 }else if(target > array[i][mid]){ 16 low = mid + 1; 17 }else{ 18 high = mid - 1; 19 } 20 if(findTarget) break; 21 } 22 if(findTarget) break; 23 } 24 25 return findTarget; 26 } 27 };
*二分法使用的注意:
1. 循环条件为 low <= high,low < high 是错误的
2. 计算mid,使用 mid = (low + high) / 2 可能会溢出,此时采用 mid = low + ( high - low ) / 2; 同时,计算机位运算快于除法,采用 mid = low + (high - low)>>1
3. 选择上下边界时不能使用 low = mid 或 high = mid ; 应该使用 low = mid + 1 或 high = mid -1
*****2020/10/13 目前才开始刷题,其他方法后续学的差不多了再补****
原文:https://www.cnblogs.com/SAzSkjEydrD2B9yu/p/13812447.html