怒刷力扣(搜索插入位置)

简介: 二分法是一个家喻户晓的算法了,是查找算法里面的最简单的算法之一吧,如果你还不会,那必须得来看看,学习学习了。

搜索插入位置

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

题目

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

分析

初步思考

因为是个已经排好序的数组,在里面寻找目标值,首先想到的就是家喻户晓的二分法。每次查找中间的值,每轮减少一半的遍历。这时候的时间复杂度,恰好就是O(log n),也满足题目要求

继续思考

要写二分法,关键的就是要找中间的数的位置。

假设我们的数组长度是5。则第三个是我们的中间位置,也就是下标为2。(0+5-1)/2=2。

假设我们的数组长度是6。则第三或第四个是我们的中间位置,也就是下标为2或3。(0+6-1)/2=3。

我们有三个指针,一个指向头指针,一个指向尾指针,另一个自然就是我们中间指针。当中间的指针的值不是我们目标值且大于我们的目标值,我们就将尾指针变为中间指针的位置 -1;当中间的指针的值不是我们目标值且小于我们的目标值,我们就将头指针变为中间指针的位置+1;直到头指针大于等于尾指针还没找到,那么目标值必然插入到当前位置的后一个位置,如果找到了,自然不必说,返回下标即可。

答案

   public static int searchInsert(int[] nums, int target) {
        int first = 0;
        int end = nums.length - 1;
        while (first <= end) {
            int mid = (end + first) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] > target) {
                end = mid - 1;
            }
            if (nums[mid] < target) {
                first = mid + 1;
            }
        } 
       return first;
    }

复杂度

  • 时间复杂度:O(logn),其中 n 为数组的长度。
  • 空间复杂度:O(1)。我们只需要常数空间存放三个指针的位置。

总结

这个题就是个简单的二分法,二分法是个典型的算法。

画个图,简单理解下,有序数组[1,2,3,4,5,6],目标值5。

  • 第一轮,头节点在0的位置,尾节点在5的位置,中间节点在2的位置。对比3小于目标值5。

image.png

  • 第二轮,移动头节点到中间节点+1的位置3。移动中间节点到(3+6-1)/2=4。对比就是目标值返回下标4。

image.png

都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!

目录
相关文章
|
4天前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
4天前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵
|
4天前
|
算法
LeetCode第35题搜索插入位置
这篇文章介绍了LeetCode第35题"搜索插入位置"的解题方法,通过使用二分查找法,高效地找到在有序数组中插入一个目标数的最佳位置。
LeetCode第35题搜索插入位置
|
4天前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
14天前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
18 4
|
15天前
|
算法 Python
【Leetcode刷题Python】74. 搜索二维矩阵
两种解决LeetCode "搜索二维矩阵" 问题的方法的Python实现。第一种方法是从二维矩阵的右上角开始线性搜索,通过比较当前元素与目标值来决定搜索方向。第二种方法是将二维矩阵视为一维数组进行二分查找,通过计算中间元素的行列索引来更新搜索区间。两种方法都旨在高效地判断目标值是否存在于给定的有序二维矩阵中。
11 0
|
15天前
|
算法 索引 Python
【Leetcode刷题Python】33. 搜索旋转排序数组
解决LeetCode "搜索旋转排序数组" 问题的Python实现代码。代码使用了二分查找算法,首先检查目标值是否存在于数组中,然后通过比较数组中间值与数组首尾值来确定应该在数组的哪一半继续搜索,直到找到目标值或搜索范围为空。如果找到目标值,返回其索引;如果搜索结束仍未找到,返回 -1。
9 0
|
15天前
|
索引 Python
【Leetcode刷题Python】35. 搜索插入位置
解决在排序数组中查找目标值并返回其索引或插入位置的问题的Python实现代码。
10 0
|
2月前
力扣每日一题 6/11 暴力搜索
力扣每日一题 6/11 暴力搜索
12 0
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值