当前位置: 首页 > article >正文

leetCode 33:搜索旋转排序数组

题目:

整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4

示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1

示例 3:
输入:nums = [1], target = 0
输出:-1

思路

这道二分查找,非常高频,可以多练习下。

  • 二分查找,循环条件一般是 left <= right
  • 找到了目标数据,就返回下标
  • 因为原本的数组就是有序的,将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的。
    按照 【0, mid) , 【mid, right) 的区间 划分。

代码

    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 left = 0;
        int right = n - 1;

        // 左边界比右边界小, 不断迭代,最后结束循环
        while (left <= right) {
            int mid = (left + right) / 2;
            //注意:找到了目标数据,就返回下标
            if (nums[mid] == target) {
                return mid;
            }

            // 因为原本的数组就是有序的,将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的。
            if (nums[0] <= nums[mid]) {
                // 如果 落在 【0, mid) 的区间
                if (nums[0] <= target && target < nums[mid]) {
                    // 调整 右边距
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }

            } else {
                // 如果 落在 【mid, right) 的区间
                if (nums[right] >= target && target > nums[mid]) {
                    // 调整 左边距
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }

            }

        }
        return -1;
    }



http://www.kler.cn/a/468549.html

相关文章:

  • 分布式多机多卡训练全景指南:MPI、DeepSpeed 与 Colossal-AI 深度解析
  • vue3组件化开发优势劣势分析,及一个案例
  • 202-01-06 Unity 使用 Tip1 —— UnityHub 模块卸载重装
  • GitLab集成Runner详细版--及注意事项汇总【最佳实践】
  • 【NLP高频面题 - 分布式训练篇】ZeRO主要为了解决什么问题?
  • 计算机网络——数据链路层-流量控制和可靠传输
  • Android 系统服务DisplayManagerService和DisplayDevice生命周期解读
  • Redis数据库笔记——ZSet的底层实现(跳表)
  • 密码学原理技术-第十四章-Key Management
  • 力扣-20-有效的括号-栈
  • Qt笔记:网络编程Tcp
  • 自闭症儿童康复个案研究:深度解析治疗效果
  • C/C++中new/delete与malloc/free的区别及对象管理
  • Hello 2025
  • 《机器学习》从入门到实战——决策树
  • 记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)
  • 算法13、基础二分查找的应用(木根切割等)
  • kubernetes-循序渐进了解coredns
  • 打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet
  • Spring Boot教程之四十九:Spring Boot – MongoRepository 示例
  • 【数据结构与算法:二、线性表】
  • Zookeeper模式安装Kafka(含常规、容器两种安装方式)
  • SpringBoot的6种API请求参数读取方式
  • 【C++】P1428 小鱼比可爱
  • Unity开发2d游戏全套教程[入门案例]
  • 0-基于蚁群优化和带注意力机制的循环神经网络的新型混合算法用于解决旅行商问题(HAL science)(完)