搜索旋转排序数组

简介: 搜索旋转排序数组

搜索旋转排序数组
题目描述:整数数组 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 。

示例说明请见LeetCode官网。

解法一:二分查找
首先,如果nums只有一个数字,直接判断这个数字是否等于target,并返回结果;

如果nums不止一位,首先遍历一遍nums获取最大值的位置maxIndx,然后分两种情况:

判断target如果不大于nums最后一位的数,则用二分查找法查找nums中(maxIndx, nums.length - 1)中是否存在跟target值相等的元素,如果有返回相应的位置,如果没有返回-1;
如果target大于nums最后一位的数,则用二分查找法查找nums中(0, maxIndx)中是否存在跟target值相等的元素,如果有返回相应的位置,如果没有返回-1。

public class LeetCode_033 {
   
    public static int search(int[] nums, int target) {
   
        if (nums.length == 1) {
   
            if (nums[0] == target) {
   
                return 0;
            } else {
   
                return -1;
            }
        }
        // 最大值的位置
        int maxIndx = -1;
        for (int i = 0; i < nums.length - 1; i++) {
   
            if (nums[i] > nums[i + 1]) {
   
                maxIndx = i;
                break;
            }
        }
        if (target <= nums[nums.length - 1]) {
   
            return find(nums, maxIndx + 1, nums.length - 1, target);
        } else {
   
            return find(nums, 0, maxIndx, target);
        }
    }

    /**
     * 二分查找
     * @param nums
     * @param left
     * @param right
     * @param target
     * @return
     */
    public static int find(int[] nums, int left, int right, int target) {
   
        int mid;
        while (left <= right) {
   
            mid = (left + right) / 2;
            if (nums[mid] == target) {
   
                return mid;
            } else if (nums[mid] < target) {
   
                left = mid + 1;
            } else {
   
                right = mid - 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
   
        int[] nums = new int[]{
   4, 5, 6, 7, 0, 1, 2};
        System.out.println(search(nums, 0));
    }
}
相关文章
|
运维 Kubernetes Cloud Native
腾讯云私有云平台运维面试
根据会议将面试问题进行总结,很多问题感觉当时没回答好,这是为啥呢?应该还是不熟练吧,或者不善于表达。将次经历分享出来,大家多练练。
794 0
|
存储 机器学习/深度学习 分布式计算
HDFS Federation简介
背景 熟悉大数据的人应该都知道,HDFS 是一个分布式文件系统,它是基于谷歌的 GFS 思路实现的开源系统,它的设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的 HDFS 架构中有2个 NameNode 和多个 DataNode 的,如下: 从上面可以看出 HDFS 的架构其实大致可以分为两层: Namespace:由目录,文件和数据块组成,支持常见的文件系统操作,例如创建,删除,修改和列出文件和目录。
|
Android开发 Windows
windows下用qemu搭建android
1.下载Qemu for windows 版本为qemu-0.9.0-windows 2.下载qemuwith-kqemu-support 安装kqemu的目的就是为了加快qemu的子系统运行速度.在X86的硬件平台上模拟x86的操作系统可以飙到真实机器速度. 直接用QEMU来安装或者运行系统的话,速度会很慢.用kqemu会改善很多.右键点击kqemu.inf,选择“安装”,然后在CMD窗口下输入命令:net start kqemu。
4359 0
|
分布式计算 Serverless 调度
EMR Serverless Spark:结合实时计算 Flink 基于 Paimon 实现流批一体
本文演示了使用实时计算 Flink 版和 Serverless Spark 产品快速构建 Paimon 数据湖分析的流程,包括数据入湖 OSS、交互式查询,以及离线Compact。Serverless Spark完全兼容Paimon,通过内置的DLF的元数据实现了和其余云产品如实时计算Flink版的元数据互通,形成了完整的流批一体的解决方案。同时支持灵活的作业运行方式和参数配置,能够满足实时分析、生产调度等多项需求。
61065 107
|
SQL 分布式计算 Spark
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
890 0
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
|
Oracle 关系型数据库 MySQL
Flink CDC产品常见问题之用superset连接starrocks报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
数据可视化 测试技术 持续交付
Git Flow规范在工作中的使用流程
Git Flow规范在工作中的使用流程
298 0
|
算法 C语言
C语言基本结构:顺序、选择和循环
C语言基本结构:顺序、选择和循环
317 0
|
消息中间件 存储 SQL
Apache Paimon 在同程旅行的实践进展
同程旅行大数据计算组负责人吴祥平,在 Apache Paimon Meetup 的分享。
776 0
Apache Paimon 在同程旅行的实践进展
|
程序员 开发者
CMMI-技术评审管理方案
CMMI-技术评审管理方案
406 0