1. 程式人生 > >leetcode 35 Search Insert Position.(搜尋元素插入陣列的位置)

leetcode 35 Search Insert Position.(搜尋元素插入陣列的位置)

題目要求:

給定一個排好順序陣列和一個目標值,搜尋陣列,如果找到目標,那麼返回索引。如果沒有,那麼返回該目標值應該插入陣列的位置索引
假設陣列中沒有重複項。

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();
        }
};

原題連結:https://leetcode.com/problems/search-insert-position/