目錄給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。
你可以假設陣列中無重複元素。
示例 1:
輸入: [1,3,5,6], 5
輸出: 2
示例 2:
輸入: [1,3,5,6], 2
輸出: 1
示例 3:
輸入: [1,3,5,6], 7
輸出: 4
示例 4:
輸入: [1,3,5,6], 0
輸出: 0
我們直接遍歷給定排序陣列nums
中查詢val
值,大致會出現三種情況:
經過上述討論,我們可以將第
二、三情況判斷條件歸結到一起:對於排序陣列,只要當nums[i] >= val
,我們就可以返回當前下標。
完整**如下:
class solution
// 退出迴圈後則直接在陣列末尾插入元素
return num;
}};
注意右區間為開區間,所以初始化左右邊界時,右邊界可以賦值為陣列的長度
實際上該下標是越界的,無法訪問到
int left = 0, right = nums.size();
然後求取中值時取左中值,並且需要注意防止溢位:
int mid = left + (right - left) / 2;
對於中值下標我們與目標值進行比較:
完整**如下:
class solution
return left;
}};
注意討論的區間為左閉右閉區間,所有右邊界的初始下標必須是確實能夠進行訪問的:
int left = 0, right = num - 1;
關於中值的計算方式類似,但是因為是閉區間,無論nums[mid]
與target
關係如何,都需要對中值mid進行加(減)一操作。
因為雙閉區間的迴圈判斷條件為while (left <= right)
,所以退出while迴圈後左右邊界的關係為left = right + 1
,總共可分為四種情況進行討論:
綜上討論,退出迴圈後關於插入元素下標的選擇,要麼選擇left
,要麼選擇right + 1
。
完整**如下:
class solution
return right + 1;
}};
35 搜尋插入位置 c
c 實現 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。使用二分法進行查詢。假設插入位置為pos,則有nums pos 1 target nums pos include include using...
35 搜尋插入位置
給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例 4 輸入...
35 搜尋插入位置
給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例 4 輸入...