一看就會,一寫就廢的原因找到了!
先上題目:
給定乙個 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 ...