- 數組是存放在連續內存空間上的相同類型數據的集合
- 數組下標都是從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