LeetCode第81题搜索旋转排序数组 II

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

分析一波题目

本题目是LeetCode第33题搜索旋转排序数组的升级版本,本题难点在于数组中有重复数值。

第33题已经说明旋转后的有序特点。

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

比如 0,0,1,2,2,5,6,7,8 在位置4旋转之后变成了2,5,6,7,8,0,0,1,2 第一次二分后,前半部分2,5,6,7,8 是严格递增的。这种情况二分搜索就好搜索了。

  1. 二分中间位置mid前的数据不是严格递增的,这种情况需要看目标数据在不在后半部分。后半部分是有序的。

再比如 比如 0,0,1,2,2,5,6,7,8 在位置6旋转变成了6,7,8,0,0,1,2,2,5 这样第一次二分后,前半部分 6,7,8,0,0是分两个阶段的,但是后半半部分1,2,2,5 是有序的。

而本题是数组中数字有重复,因此我们只要在33题的基础上加上去重就可以解决了。

本题解题技巧

1、二分法是搜索有序数组的,借助旋转后的特点,二分法同样可以搜索。本题需要注意去重逻辑

编码解决

java 复制代码
class Solution {
    public boolean search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return false;
        }
        if (n == 1) {
            return nums[0] == target ? true : false;
        }
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (nums[mid] == target) return true;
            //相同的数,去重
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
                ++l;
                --r;
            } else if (nums[l] <= nums[mid]) { //左边是严格递增的
                //数据在左边
                if (nums[l] <= 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 false;
    }
}

总结

1、本题的关键是理解两个旋转有序数组后的特点。

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

II. 二分中间位置mid前的数据不是严格递增的,这种情况需要看目标数据在不在后半部分。

相关推荐
带多刺的玫瑰2 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
哭泣方源炼蛊3 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
JavaGuide3 小时前
SpaceX 工程师的 AI Coding 玩法太牛了, 200 多个 Agent 并行!
前端·后端
SQL-First布道者3 小时前
⚡Spring JDBC 完整体系 · 第 10 集 · 手搓 `BaseCondition`
java·spring boot·后端·spring·mybatis·spring jdbc
牧羊人.3333 小时前
动手学深度学习 02 | 手写数字识别
图像处理·人工智能·深度学习·算法
2601_962074683 小时前
Spring Boot的无缝衔接:深入解析与实践
数据库·spring boot·后端
武帝为此3 小时前
【InnoDB存储引擎介绍】
数据库·算法
聪明蛋子哟4 小时前
多智能体协作的三种模式:从群聊到分层,如何设计可扩展的Agent系统
后端·python·flask
shehuiyuelaiyuehao4 小时前
算法32,连续数组,前缀和+哈希表
算法·leetcode·职场和发展
DolphinDB4 小时前
告别手写代码:Trae + DolphinDB Skill,10 分钟造一个懂期货的投研 Agent
后端