搜索插入位置

一、問題

給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存在于數(shù)組中,返回它將會被按順序插入的位置??梢约僭O數(shù)組中無重復元素。

示例 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??方法一:二分查找

假設題意是在排序數(shù)組中尋找是否存在一個目標值,那么立馬就能想到利用二分法在 O(logn) 的時間內(nèi)找到是否存在目標值。但這題還多了個額外的條件,即如果不存在數(shù)組中的時候需要返回按順序插入的位置,那還能用二分法么?答案是可以的,只需要稍作修改即可??紤]這個插入的位置 pos,它成立的條件為:nums[pos-1] < target ≤ nums[pos]

其中 nums 代表排序數(shù)組。由于如果存在這個目標值,我們返回的索引也是 pos,因此可以將兩個條件合并得出最后的目標:「在一個有序數(shù)組中找第一個大于等于 target 的下標」。

問題轉化到這里,直接套用二分法即可,即不斷用二分法逼近查找第一個大于等于 target 的下標 。ans 初值設置為數(shù)組長度可以省略邊界條件的判斷,因為存在一種情況是 target 大于數(shù)組中的所有數(shù),此時需要插入到數(shù)組長度的位置。

class Solution {
    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
}

①時間復雜度:O(logn),其中 n 為數(shù)組的長度。二分查找所需的時間復雜度為 O(logn)。
②空間復雜度:O(1)。只需要常數(shù)空間存放若干變量。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存在于數(shù)組中,返回它將會被按順序插入的...
    一只小星_閱讀 137評論 0 0
  • 更多精彩內(nèi)容,請關注【力扣簡單題】。 題目 難度:類型:數(shù)組 給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并...
    玖月晴閱讀 1,334評論 0 0
  • 來源:力扣(LeetCode)鏈接:https://leetcode-cn.com/problems/search...
    公孫劍人閱讀 223評論 0 0
  • 給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存在于數(shù)組中,返回它將會被按順序插入的...
    刻苦驢噥閱讀 173評論 0 0
  • LeetCode第35題 題目描述:給定一個排序數(shù)組和一個目標值,在數(shù)組中找到目標值,并返回其索引。如果目標值不存...
    Lularible閱讀 201評論 0 1

友情鏈接更多精彩內(nèi)容