畫解算法:35. 搜索插入位置

題目連接

leetcode-cn.com/problems/se…java

題目描述

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

你能夠假設數組中無重複元素。數組

示例 1:bash

輸入: [1,3,5,6], 5
輸出: 2
複製代碼

示例 2:spa

輸入: [1,3,5,6], 2
輸出: 1
複製代碼

示例 3:code

輸入: [1,3,5,6], 7
輸出: 4
複製代碼

示例 4:cdn

輸入: [1,3,5,6], 0
輸出: 0
複製代碼

解題方案

思路

  • 標籤:二分查找
  • 若是該題目暴力解決的話須要O(n)的時間複雜度,可是若是二分的話則能夠下降到O(logn)的時間複雜度
  • 總體思路和普通的二分查找幾乎沒有區別,先設定左側下標left和右側下標right,再計算中間下標mid
  • 每次根據nums[mid]target之間的大小進行判斷,相等則直接返回下標,nums[mid]<target則left右移,nums[mid]>target則right左移
  • 查找結束若是沒有相等值則返回left,該值爲插入位置
  • 時間複雜度:O(logn)

二分查找的思路不難理解,可是邊界條件容易出錯,好比循環結束條件中left和right的關係,更新left和right位置時要不要加1減1blog

下面給出兩個能夠直接套用的模板,記住就行了,免除邊界條件出錯。排序

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;
    }
}
複製代碼

代碼

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;
    }
}
複製代碼

畫解

fr<x>ame_00001.png
fr<x>ame_00002.png
fr<x>ame_00003.png
fr<x>ame_00004.png
fr<x>ame_00005.png
fr<x>ame_00006.png

後臺回覆「算法」,加入每天算法羣

相關文章
相關標籤/搜索