画解算法: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

后台回复「算法」,加入每天算法群

相关文章
相关标签/搜索