前言
你好, 我是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; //最后的位置就是应该插入的位置
}
}