leetcode 35 Search Insert Position.(搜尋元素插入陣列的位置)
阿新 • • 發佈:2018-12-31
題目要求:
給定一個排好順序陣列和一個目標值,搜尋陣列,如果找到目標,那麼返回索引。如果沒有,那麼返回該目標值應該插入陣列的位置索引。
假設陣列中沒有重複項。
Example:
例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
解題思路
1.暴力遍歷法
如果找到目標值,那麼返回索引,如果沒找到,也很簡單,只要返回第一個比目標值大的元素索引即可。時間複雜度較高,不推薦。
主要程式碼C++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for(int i = 0; i< nums.size(); i++)
if (nums[i] == target) return i;
for(int i = 0; i<nums.size(); i++)
if(nums[i] > target) return i;
return nums.size();
}
};
2.二分查詢法
二分法的思想是計算當前區間的中間元素的值,把區間分成兩部分,然後與target比較,然後根據比較結果決定下一次在前區間還是後區間進行查詢
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int start = 0;
int end = nums.size() - 1;
while(start<=end)
{
int mid = start + (end - start)/2;
if(nums[mid] < target)
start = mid + 1;
else
end = mid - 1;
}
return start;
}
};
3. lower_bound()法
在討論區看到的騷操作,確實挺好用的,一行程式碼解決戰鬥。
lower_bound()和upper_bound()都是利用二分查詢的思想,在一個排好順序(正好題目滿足要求)的陣列中查詢。
lower_bound(), upper_bound()區別:
lower_bound(begin,end,target),找到第一個大於或等於目標值的數,返回地址,通過減去起始地址begin,得到數字在數總中的下標。
upper_bound(begin,end,target),找到第一個大於(沒有等於!!)目標值的數,返回地址,通過減去起始地址begin,得到數字在數總中的下標。看下程式碼:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
` return lower_bound(nums.begin(), nums.end(), target) - nums.begin();
}
};