704 二分查詢

2022-09-19 09:33:10 字數 1473 閱讀 5568

一看就會,一寫就廢的原因找到了!

先上題目:

給定乙個 n 個元素有序的(公升序)整型陣列 nums 和乙個目標值 target  ,寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9

輸出: 4

解釋: 9 出現在 nums 中並且下標為 4

示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2

輸出: -1

解釋: 2 不存在 nums 中因此返回 -1

你可以假設 nums 中的所有元素是不重複的。

n 將在 [1, 10000]之間。

nums 的每個元素都將在 [-9999, 9999]之間。

廢的原因,有三個:

while迴圈裡面的left與right的關係;left

left和right如何隨著nums[middle]與target的大小關係變化?是否+-1

返回值是什麼?left?right?

答案揭曉:

版本一:

class solution else

}return -1;

}}

版本二:

class solution else

}return -1;

}}

主要對比為下:

right=len-1; vs right=len;

while(left<=right) vs while(left左列的查詢區間是[left, right],

右列的查詢區間是[left, right)

這就首先決定了初始right的賦值情況是陣列的最大下標還是陣列的長度;

其次,在while迴圈條件判定時,對於雙閉區間,肯定存在一種特殊情況,即left==right,故left<=right;對於左開右閉區間,首先要明確一件事,即right不可能為target下標(開集,right下標並不在查詢範圍內),那left可以等於right嗎?不可以,因為右開,right不在查詢範圍內;若left等於right,與上面矛盾,故left

當nums[middle]>target時,對於左列,其查詢空間為[left, middle-1],這是因為雙閉,下標middle肯定不是,那就middle-1咯;而對於右列,其由於其左閉右開,查詢範圍要截至到最後乙個肯定不是target的下標那,即right

關鍵是要搞懂while的查詢空間呀!

704 二分查詢

給定乙個 n 個元素有序的 公升序 整型陣列 nums 和乙個目標值 target 寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 1。示例 1 輸入 nums 1,0,3,5,9,12 target 9 輸出 4 解釋 9 出現在 nums 中並且下標為 4 示例 ...

二分查詢704

給定乙個 n 個元素有序的 公升序 整型陣列 nums 和乙個目標值 target 寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 1。示例 1 輸入 nums 1,0,3,5,9,12 target 9 輸出 4 解釋 9 出現在 nums 中並且下標為 4 示例 ...

704 二分查詢

簡單 704.二分查詢 給定乙個 n 個元素有序的 公升序 整型陣列 nums 和乙個目標值 target 寫乙個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 1。示例 1 輸入 nums 1,0,3,5,9,12 target 9 輸出 4 解釋 9 出現在 nums ...