35.LeetCode - 搜索插入位置

88 阅读1分钟

前言

你好, 我是Cici。我一直觉得自己的算法比较菜,所以打算自己重新系统的刷一刷,谈谈自己的思路,说说自己的思考,加强自己的同时也希望能给大家带来帮助。其实数据结构和算法属于我们技术人员的内功,不管技术怎么更新,它始终都是不变的。

一、问题描述

原题链接:35.LeetCode - 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4
  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

二、题目分析

首先观察题目,可以注意到两个关键信息,一个是无重复元素,一个是升序数组,这两个条件是使用二分查找法的基本条件,如果有重复元素,那么最终返回的索引结果就不唯一了,其次如果数组无序,那么就无法确定目标元素在哪个区间了。所以本题使用二分查找法即可解决。

三、参考代码

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2; // 防止溢出
            if(nums[mid] == target){ //如果当前元素就是目标元素,直接返回下标
                return mid;
            }else if(nums[mid] <= target){ //如果当前元素小于目标元素,则应该在当前元素右边的区间继续去查找
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return left; //最后的位置就是应该插入的位置
    }
}
image.png