【剑指offer】旋转数组的最小数字

news2024/10/7 18:24:42

文章目录

  • 题目
  • 思路
  • 代码实现


题目

题目链接入口:JZ11 旋转数组的最小数字
在这里插入图片描述

思路

1.核心考点
(1)数组理解,二分查找,临界条件。

2.解题思路
(1)题目要求查找出一维数组的最小值,本质是一个求最小值的过程,并且查找的本质是排除的过程,那么一次排除一个和一次排除一批,当然是后者的效率更高。
(2)方法一:暴力查找算法,遍历一遍数组,先假设第一个元素是最小值,设为min,遍历数组时,如遇到比min更小的元素,则让min等于这个元素,遍历完整个数组,就可以找到数组的最小值了。但是这种方法不推荐,一次只排除了一个元素。
(3)方法二:也是暴力查找算法,但与方法一有所不同。一定要注意题目的特性:原数组是非递减序列。因为是非递减数组旋转,旋转之后,就有可能出现递减,引起递减的数字就是最小值。如下图,我们一开始可以定义两个指针left和right,分别指向3,4,如果left<right,left和right都向后走一步,如果right指向的元素,小于left指向的元素,则array[right]就是数组的最小值。不过这个方法也不推荐,因为最坏情况下,也需要把数组全部遍历一遍。代码我还是贴在下面了。
在这里插入图片描述
(4)方法三(极度推荐):采用二分查找的方式,进行定位
因为原数组是非递减序列,所以旋转过后,数组可以看成两部分,前半部分整体非递减,后半部分整体非递减,且前半部分整体大于后半部分

所以,我们假设如下定义,left指向最左侧,right指向最右侧,mid为二分之后的中间位置。

若arr[mid]>arr[right],说明mid位置在原数组前半部分,进一步说明,目标最小值,在mid右侧,缩小区间,让left=mid+1;

若arr[mid]<arr[right],说明mid位置在原数组后半部分,进一步说明,目标最小值,为mid所在位置的元素,或在mid的左侧,缩小区间,让right=mid;

若arr[mid]==arr[right],因为题目所给是非递减序列,所以有可能是相同值,这时将right–,缩小区间。

循环的条件是left<right

具体演示如下图:(我将过程手画了出来,这样更快,更详细,码文不易给孩子点个赞把~)
在这里插入图片描述

代码实现

C++版本:
方法二:暴力算法

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size()==0)
        {
            return 0;
        }
        for(int i=0;i<rotateArray.size()-1;i++)
        {
            if(rotateArray[i]>rotateArray[i+1])
            {
                return rotateArray[i+1];
            }
        }
        //全部相等的情况
        return rotateArray[0];
    }
};

方法三(推荐):二分查找

class Solution {
public:
    int minNumberInRotateArray(vector<int> arr) {
        //特殊情况,数组中没有元素,返回0
        if(arr.size()==0)
        {
            return 0;
        }
        //1.定义首尾下标
        int left=0;
        int right=arr.size()-1;

        //2.开始查找旋转数组的最小元素
        //(1)排除思想,二分查找
        while(left<right)
        {
            //确定数组中心
            int mid=left+((right-left)>>2);//防止数据溢出

            //4567 123
            //mid==7>3,所以mid当前在原数组前半部分,最小数在[mid+1,right]中
            if(arr[mid]>arr[right])
            {
                left=mid+1;
            }
            else if(arr[mid]<arr[right])//5 1234,说明最小数字在[left,mid]中
            {
                right=mid;
            }
            else//arr[mid]==arr[right]//1235555  1125555
            {
                right--;
            }
        }
        return arr[left];
    }
};

java版本:
方法一:


import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if (array == null || array.length == 0) {
            return 0;
        }
        
        for (int i = 0; i < array.length - 1; i++) {
            if (array[i] > array[i + 1]) {
                return array[i + 1];
            }
        }
        return array[0];
    }
}

方法三(推荐):二分查找

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            //最小的数字在mid右边
            if (array[mid] > array[right])
                left = mid + 1;
            //无法判断,一个一个试
            else if (array[mid] == array[right])
                right--;
            //最小数字要么是mid要么在mid左边
            else
                right = mid;
        }
        return array[left];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

变分模态分解(VMD)学习

目录 概述构造变分问题变分求解问题(引入拉格朗日)关于变分构造中的函数理解关于Uk(t)关于希尔伯特变换关于频谱调制 VMD算法(python) 概述 变分模态分解由Konstantin Dragomiretskiy于2014年提出&#xff0c;可以很好抑制EMD方法的模态混叠现象&#xff08;通过控制带宽来避免…

信息竞赛笔记(2)––快速幂

目录 快速幂 定义 分析 代码 递归实现 非递归实现(通用方法) 模意义下取幂 快速幂 定义 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在的时间内计算的小技巧&#xff0c;而暴力的计算需要的时间。 这个技巧也常常用在非计算的场景&#xff0c;因为它可…

【论文】通过基准分析优化联邦人员重新识别的性能

论文链接 目录 摘要1. 绪论2. 相关工作2.1 人员重新识别2.2 联邦学习 3. 联邦 个人REID基准3.1 数据集3.2 联合方案3.3 模型结构3.4 联邦学习算法3.5 性能指标3.6 参考实现4.1 通过相机联合方案4.2 按数据集联合方案 5. 性能优化5.1 知识蒸馏5.2 权重调整5.3 知识蒸馏和体重调…

提高代码质量的秘诀:类、方法、字段和包注释

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f362; 一、注释的插入 &#x1f363; 二、类注释 &#x1f364; 三、方法注释 &#x1f365; 四、字段注释 &#x1f96e; 五、…

GreenPlum集群部署之抽丝剥茧

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

【stable diffusion原理解读通俗易懂,史诗级万字爆肝长文,喂到你嘴里】

文章目录 一、前言&#xff08;可跳过&#xff09;二、stable diffusion1.clip2.diffusion modelforward diffusion &#xff08;前向扩散&#xff09;逆向扩散&#xff08;reverse diffusion&#xff09;采样图阶段小结 3.Unet modeltimestep_embedding采用正余弦编码 三、sta…

华为OD机试真题 Java 实现【求符合要求的结对方式】【2023Q1 100分】,附详细解题思路

一、题目描述 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入描述 6 2 3 3 4 5 1 6 第一行为员工的总人数&#xff…

精简总结:一文说明软件测试基础概念

基础概念-1 基础概念-2 目录 一、什么是软件测试&#xff1f; 二、软件测试的特点 三、软件测试和开发的区别 1、内容&#xff1a; 2、技能区别 3、工作环境 4、薪水 5、发展前景 6、繁忙程度 7、技能要求 四、软件测试与调试的区别 1、角色 2、目的 3、执行的阶…

Lecture 7 Deep Learning for NLP: Feedforward Networks

目录 Deep LearningFeedforward Neural Network 前馈神经网络Neuron 神经元Output Layer 输出层OptimizationRegularization 正则化Topic Classification 主题分类Language Model as Classifiers 语言模型作为分类器Word Embeddings 词嵌入Training a Feed-Forward Neural Netw…

RVOS操作系统协作式多任务切换实现-03

RVOS操作系统协作式多任务切换实现-03 任务&#xff08;task&#xff09;多任务 &#xff08;Multitask&#xff09;任务上下文&#xff08;Context&#xff09;多任务系统的分类协作式多任务 创建和初始化第 1 号任务切换到第一号任务执行协作式多任务 - 调度初始化和任务创建…

虚拟机-安装与使用2023

虚拟机-安装与使用 前言 一、虚拟机 1.VMware 2.Virtualbox 二、VMware 的下载 三、VMware 的安装 四、验证是否安装成功 五、运行 VMware 六、VMware 上安装其它操作系统 安装 Windows 10安装 CentOS-Linux安装 Kali-Linux 七、VMware 常用功能同步时间系统备份克隆快照内存设…

黑马Redis视频教程高级篇(多级缓存案例导入说明)

目录 一、安装MYSQL 1.1、准备目录 1.2、运行命令 1.3、修改配置 1.4、重启 二、导入SQL 三、导入Demo工程 3.1、分页查询商品 3.2、新增商品 3.3、修改商品 3.4、修改库存 3.5、删除商品 3.6、根据id查询商品 3.7、根据id查询库存 3.8、启动 四、导入商品查询…

Maven高级——私服(完结撒花!)

作用与介绍 一个公司内有两个项目组&#xff0c;如果其中一个开发了一个依赖tlias-utils,另一个项目组要使用的话要么就是传过来直接install放到自己的本地仓库里面的。 但是也可以搭建一个公共仓库&#xff0c;专门供公司局域网内部使用&#xff0c;也就是所谓私服。 然后在…

chatgpt赋能python:Python反向函数:在编程中的威力

Python反向函数&#xff1a;在编程中的威力 在Python中&#xff0c;反向函数是一个强大且常用的工具&#xff0c;可以帮助程序员在编写代码时更加高效和精确地处理数据。在本文中&#xff0c;我们将讨论Python反向函数的用途和实现&#xff0c;并详细介绍如何在您的代码中使用…

Java007——Java注释介绍

围绕以下3点介绍&#xff1a; 1、什么是Java注释&#xff1f; 2、Java注释的作用&#xff1f; 3、Java注释长什么样&#xff0c;以及怎么使用Java注释&#xff1f; 一、什么是Java注释&#xff1f; Java注释是在Java程序中用来描述代码的特殊语句。 注释被忽略并且不被编译器…

MySQL表的增删改查

目录 一、Create 1.insert 2.更新 3.替换 二、Retrieve&#xff08;查找&#xff09; 1.select 2.where 3. 结果排序 4. 筛选分页结果 三、Update 四、Delete 1.删除数据 2.截断表 五、聚合函数 1.count&#xff1a; 2.avg 3.sum 4.max 5.min 六、Group …

微信小程序开发实战 ②④(自定义 TabBar练习)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

十四、神经风格迁移

文章目录 1、神经风格迁移2、生成图片的代价函数THE END 1、神经风格迁移 \qquad 神经风格迁移就是将一幅原有的图片(content picture, C)&#xff0c;对照着一幅风格图片(style picture, S)&#xff0c;生成一幅新的图片(generated picture, G)&#xff0c;如下图所示&#xf…

k8s istio 集成 多版本应用服务 和 网格监测

说明 博客文章地址:https://blog.taoluyuan.com/posts/istio-getting-started/ 本主要是内容: 使用 istioctl 安装 istio采用 istio 官方提供 的 应用bookinfo,实现多版本的服务应用部署istio 网关 gateway,vs,dr 的基本使用利用监测工具 prometheus,grafana,jaeger 查看 ist…

关于EMC Unity 存储系统DIMM内存的几个问题

下面是客户咨询最多的几个关于EMC Unity的DIMM内存的问题&#xff0c;供大家参考。 1. Unity存储能否自己扩容内存 有客户觉得Unity存储的内容太小&#xff0c;想自己扩容内存&#xff0c;很朴实的想法&#xff0c;原来是每个控制器3条16gb&#xff0c;能不能升级到3条32gb或…