Leetcode 04——搜索插入位置(Java)

简介: Leetcode 04——搜索插入位置(Java)

前言


Algorithms + Data Structures = Programs.


                                                       ————Pascal之父 Nicklaus Wirth


算法 + 数据结构 = 程序


坚持刷算法题,变得更强!


本篇博客将用两种方法解题!带你感受不一样的思路


题目及解析

图片.png


解题目标:当此数组中有一个元素值等于给定的target值,返回其下标,如果数组元素中没有元素值等于target值,则返回插入位置的下标

肯定不是随便插入,必须保证插入此值后,数组依然保持元素值从大到小排序。


思路

因为题目要求我们用时间复杂度为O(log n)来解题,所对应的其实就是二分查找,首先我们先定义左右下标用来查找,分别是left和right,再定义一个中间下标mid,让mid去找下一次寻找下标的区间。


left从0开始,right则从数组长度减1开始。这样我们就设想一个循环,不断地进行mid =(left+right)/ 2   的运算,直到找到那个元素的下标或者适合插入的位置下标为止!


情况 1:如果当前 nums[mid] 值小于 target,那么 mid 以及 mid 左边的所有元素就一定不是「插入元素的位置」,因此下一轮搜索区间是 [mid + 1..right],下一轮把 left 移动到 mid + 1 位置,所以 left = mid + 1;

情况 2:如果 nums[mid] 值大于等于 target,那么 mid 可能是「插入元素的位置」,mid 的右边一定不存在「插入元素的位置」。如果 mid 的左边还是不存在「插入元素的位置」,我们才可以真的说 mid 是「插入元素的位置」。因此下一轮搜索区间是 [left..mid],下一轮把 right 移动到 mid 位置,所以 right = mid。最后我们就可以确定插入元素的位置了。


解题代码

classSolution {
publicintsearchInsert(int[] nums, inttarget) {
intlen=nums.length;
// 特殊判断if (nums[len-1] <target) {
returnlen;
        }
// 程序走到这里一定有 nums[len - 1] >= target,插入位置在区间 [0..len - 1]intleft=0;
intright=len-1;
// 在区间 nums[left..right] 里查找第 1 个大于等于 target 的元素的下标while (left<right) {
intmid=left+ (right-left) /2;
if (nums[mid] <target){
// 下一轮搜索的区间是 [mid + 1..right]left=mid+1;
            } else {
// 下一轮搜索的区间是 [left..mid]right=mid;
            }
        }
returnleft;
    }
}

第二种解题

这种解题非常简单,但缺点就是不符合题目要求中空间复杂度O(log n),只能当做一种思路给大家看看。


解题代码

classSolution {
publicintsearchInsert(int[] nums, inttarget) {
for(inti=0; i<nums.length;i++){
if(nums[i] >=target){
returni;
        }
    }
returnnums.length;
    }
}
目录
相关文章
|
4月前
|
Java
Java搜索与替换
Java搜索与替换
32 4
Java搜索与替换
|
3月前
|
算法 索引
LeetCode(搜索插入位置)
如何使用二分查找算法来解决LeetCode上的“搜索插入位置”问题,确保时间复杂度为O(log n),并提供了详细的代码实现和分析。
19 2
|
3月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
30 0
Leetcode第三十三题(搜索旋转排序数组)
|
3月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
25 0
|
3月前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
5月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
5月前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵
|
5月前
|
算法
LeetCode第35题搜索插入位置
这篇文章介绍了LeetCode第35题"搜索插入位置"的解题方法,通过使用二分查找法,高效地找到在有序数组中插入一个目标数的最佳位置。
LeetCode第35题搜索插入位置
|
5月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
5月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
63 6