- 数组是存放在连续内存空间上的相同类型数据的集合
- 数组下标都是从0开始的
- 数组内存空间的地址是连续的
- 正是因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件
左闭右开
while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的 if(nums[middle] > target) right 更新为middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
class Solution:def search(self, nums: List[int], target: int) -> int:left=0right=len(nums)#左闭右开,因为right索引没有意义sorted(nums)while(left<right):#左闭右开,不能等于middle=(left+right)//2#计算middleif nums[middle]==target:#当等于目标值返回return middleelif nums[middle]>target:#当middle大于目标值,middle是下一个右边界,但是右开,因此只能等于right=middleelif nums[middle]<target:#当middle小于目标值,middle是下一个左边界,但是左闭,因此当前值已经取到并且不等,所以需要加1left=middle+1return -1
左闭右闭
while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution:def search(self, nums: List[int], target: int) -> int:left=0right=len(nums)-1#左闭右闭sorted(nums)while(left<=right):#左闭右闭,可以等于middle=(left+right)//2#计算middleif nums[middle]==target:#当等于目标值返回return middleelif nums[middle]>target:#当middle大于目标值,middle是下一个右边界,但是右闭,因此当前值已经取到并且不等,所以需要减1right=middle-1elif nums[middle]<target:#当middle小于目标值,middle是下一个左边界,但是左闭,因此当前值已经取到并且不等,所以需要加1left=middle+1return -1