1. 二分查找的条件:
1) 数组为有序数组
2)数组中无重复元素(有重复元素时,二分查找返回的元素下标可能不是唯一的)
2. 左闭右闭和左闭右开:
难点:确定是左闭右闭,还是左闭右开
-
1)左闭右闭[left, right]: <=, middle-1, middle+1
-
left = 0 right = num.size -1 # 判断target 是否在数组里 while (left <= right){ middle = (left + right)/2 if (nums[middle]>target){ right = middle -1; } else if (nums[middle] < target){ left = middle + 1; } else return middle; } retrun -1;
2)左闭右开[left, right): <, middle, middle+1
-
left = 0 right = num.size while (left < right){ middle = (left + right)/2 if (nums[middle]>target){ right = middle; } else if (nums[middle] < target){ left = middle + 1; } else return middle; } retrun -1;
-
注:int middle = left + ((right - left) >> 1); 这段代码和middle=(left+right)/2等效,防止超出整型数据溢出
为什么要这么写呢?-
1.位运算要比直接的乘除法运算要快
2.如果直接用(left+right)>>1可能会导致它的大小超过整形的大小
-