35 搜素插入位置

給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。

你可以假設數組中無重複元素。

示例 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. 如果該題目暴力解決的話需要O(n)的時間複雜度,但是如果二分的話則可以降低到O(logn)的時間複雜度
  2. 整體思路和普通的二分查找幾乎沒有區別,先設定左側下標left和右側下標right,再計算中間下標mid;
  3. 每次根據nums[mid]和target之間的大小進行判斷,相等則直接返回下標,nums[mid]<target則left右移,nums[mid]>target則right左移。這樣來縮小搜索範圍;
  4. 查找結束如果沒有相等值則返回left,該值爲插入位置;
  5. 時間複雜度:O(logn)

二分查找的思路不難理解,但是邊界條件容易出錯,比如循環結束條件中left和right的關係,更新left和right位置時要不要加1減1。
這裏我們可以拿幾個例子來測試邊界值,多試幾次就行了。

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

當然,記住二分的模板會事半功倍!煩人的邊界值也不會出錯。
模板一:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1; // 注意
        while(left <= right) { // 注意
            int mid = (left + right) / 2; // 注意
            if(nums[mid] == target) { // 注意
                // 相關邏輯
            } else if(nums[mid] < target) {
                left = mid + 1; // 注意
            } else {
                right = mid - 1; // 注意
            }
        }
        // 相關返回值
        return 0;
    }
}

模板二

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length; // 注意
        while(left < right) { // 注意
            int mid = (left + right) / 2; // 注意
            if(nums[mid] == target) {
                // 相關邏輯
            } else if(nums[mid] < target) {
                left = mid + 1; // 注意
            } else {
                right = mid; // 注意
            }
        }
        // 相關返回值
        return 0;
    }
}

有問題歡迎留言哦

參考:

https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/

https://draw.mdnice.com/algorithm/35.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章