Given an array of integers
nums
which is sorted in ascending order, and an integertarget
, write a function to searchtarget
innums
. Iftarget
exists, then return its index. Otherwise, return-1
.
You must write an algorithm withO(log n)
runtime complexity.
給定一個整數陣列,以升序排列,並給定一個target
整數,請撰寫一個函數尋找targets
在整數陣列的索引位置,如果沒有找到就回傳-1
,演算法要求時間複雜度必須O(log n)
題目就是希望我們使用二分搜尋來找到相對應的目標,如果看到題目為是有序陣列以及無重複元素的話,基本上就是用二分搜尋來解題了,二分收尋最重要的就是邊界條件的處理,邊界分為四種
大部分都使用左閉右開或左閉右閉,當在進行二分搜尋時,需要檢查的是邊界部分是否有意義?以及保持迴圈不變量原則處理
while(left <= right)
,需要使用<=
,因為left == right
是有意義的if (nums[mid] > target)
的時候,mid = left -1
,因為當前mid
位置一定不是target
,因此我們的區間必須遵循原則,移動到left = mid - 1
while(left < right)
,需要使用 <
,因為當left == right
時是有可能超出邊界的if (nums[mid] > target)
的時候,mid = left
,因為當前mid
位置一定不是target
,而遵循區間的原則,left = mid
l
與 r
(左閉右閉)l <= r
mid = (left + right) / 2
l
至mid + 1
r
至mid - 1
int search(int* nums, int numsSize, int target) {
int l = 0;
int r = numsSize - 1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (nums[mid] == target){
return mid;
}
else if (nums[mid] < target){
l = mid + 1;
}
else {
r = mid - 1;
}
}
return -1;
}
int search(int* nums, int numsSize, int target) {
int l = 0;
int r = numsSize;
while (l < r) {
int mid = l + ((r - l) >> 1);
if (nums[mid] == target){
return mid;
}
else if (nums[mid] < target){
l = mid + 1;
}
else {
r = mid;
}
}
return -1;
}