LeetCode第33题搜索旋转排序数组

继续打卡算法题,今天学习的是LeetCode的第33题搜索旋转排序数组,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

分析一波题目

这个题目在一个数组中查找一个数字,遍历一遍也可以找到,这样时间复杂度是O(n)。但是题目要求实践复杂度是O(log n)。 因此肯定不是直接遍历求解的。

需要O(log n),我们可以使用二分查找,如果是严格有序的比较好求,但是这个有序数组是被旋转过的。

比如0124567

由于不是严格递增,二分法可能产生两种结果。

  1. 中间位置mid前的数据是严格递增的,这种情况和普通的二分求解一样。看目标数据在不在前半部分。
  2. 中间位置mid前的数据不是严格递增的,这种情况需要看目标数据在不在后半部分。

编码解决

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return -1;
        }
        if (n == 1) {
            return nums[0] == target ? 0 : -1;
        }
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (nums[mid] == target) return mid;
            //前半部分严格递增。
            if (nums[0] <= nums[mid]) {
                //目标数据在前半部分
                if (nums[0] <= target && target < nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {//前半部分不是严格递增的情况
                //目标数据在后半部分
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return -1;
    }
}

总结

二分法在有序数组中查找某个数的情况效率是比较高的。这种非严格递增的数组也可以借助二分法解决,因此只要有顺序规律,就可以使用二分法来求解。

相关推荐
小刘max16 分钟前
最长递增子序列(LIS)详解:从 dp[i] 到 O(n²) 动态规划
算法·动态规划
桦说编程18 分钟前
Guava 迭代器增强类介绍
java·后端·设计模式
谢景行^顾41 分钟前
数据结构知识掌握
linux·数据结构·算法
235161 小时前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
courtfu1 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
ShineWinsu1 小时前
对于数据结构:堆的超详细保姆级解析——下(堆排序以及TOP-K问题)
c语言·数据结构·c++·算法·面试·二叉树·
DuHz1 小时前
基于时频域霍夫变换的汽车雷达互干扰抑制——论文阅读
论文阅读·算法·汽车·毫米波雷达
_Power_Y2 小时前
计算机网络面试题
面试
上进小菜猪2 小时前
测试自动化Replay:让数据库迁移测试回归真实场景的一把“利器”
后端
Python私教2 小时前
FastAPI × SQLAlchemy 2.0 Async:从“能跑”到“可压测”的完整工程实践
后端