IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指 Offer 11. 旋转数组的最小数字 -> 正文阅读

[数据结构与算法]剑指 Offer 11. 旋转数组的最小数字

👋Hi~ o( ̄▽ ̄)ブ这里是猪猪程序员
👀 很高兴见到你O(∩_∩)O!
🌱 现在正在发芽中…
💞? 博主水平有限,如果发现错误,一定要及时告知作者哦 o( ̄︶ ̄)o!感谢感谢!
📫博主的码云 gitee,平常博主写的程序代码都在里面。

??这是一个新的专栏??我希望自己能够坚持把《剑指offer》这本书的题目刷完。


??题目来源
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:

输入:[3,4,5,1,2]
输出:1

示例 2:

输入:[2,2,2,0,1]
输出:0

分析

刚开始看这个旋转数组的时候有点模糊,仔细想了想,我的解释如下:
数组刚开始是有序的,但可能有重复的数字
在这里插入图片描述
接着按任意点将其旋转,旋转过后数组就变成有序的两个部分,但从哪里开始旋转是任意的

在这里插入图片描述
因此这种要旋转一遍的数组就是旋转排序数组
题目要求:找到这种旋转数组当中最小的数字

方法一:暴力求解法(执行用时:0 ms 内存消耗:5.5 MB)

算法

1.从下标为0的元素开始遍历
2.每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一元素即为最小值.如果查到最后一个元素都没有出现这种情况,则下标为0的元素为最小元素(因为此时说明数组中有重复的元素)

int minArray(int* numbers, int numbersSize){
            int i,j;
            int min=numbers[0];
            for(i=0;i<numbersSize;i++)
            {
                if(min>numbers[i])
                {
                    min=numbers[i];
                }
            }
            return min;
}

在这里插入图片描述

方法二:二分法(执行用时:0 ms 内存消耗:5.5 MB)

一般二分查找的过程介绍
1.找到中间的关键字
2.比较查找的关键字与中间关键字的大小关系
3.如果相等就相当于已经找到
4.如果查找的关键字小于中间的关键字则在前半部分进行同样的过程(从小到大存储)
5.如果查找的关键字大于中间的关键字则在后半部分进行同样的过程(从小到大存储)
一般二分查找的要求
1.顺序存储
2.元素有序

原因
1.通过下标即可得到关键字
2.任取一个关键字的值即可确定所寻找关键字是在它前面还是后面

算法

1.从下标为0的元素开始遍历
2.每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一元素即为最小值.如果查到最后一个元素都没有出现这种情况,则下标为0的元素为最小元素(因为此时说明数组中有重复的元素)

情况一:当没有重复数字的时候

如果numbers[mid]>numbers[right],则前半部分一定是顺序的,最小值(分界点)在mid后面
因此我们就可以缩小查找范围,直接到mid后面找最小的元素
在这里插入图片描述
如果numbers[mid]<numbers[right],则后半部分一定是顺序的,最小值(分界点)在mid前面
因此我们就可以缩小查找范围,直接到mid前面找最小的元素
在这里插入图片描述

情况二:当有重复数字的时候

会出现numbers[mid]== numbers[right]的情况
此时我们并不能确定到底分界点出现在mid的前面还是后面

在这里插入图片描述
解决方法:暴力地从右到左进行遍历,知道mid指针的元素小于right指针的元素
在这里插入图片描述

int minArray(int* numbers, int numbersSize){
        int left=0,right=numbersSize-1,mid;
        while(left<right)
        {
            mid=left+(right-left)/2;
            if(numbers[mid]<numbers[right])
            {
                right=mid;
            }
            else if(numbers[mid]>numbers[right])
            {
                left=mid+1;
            }
            else
            {
                right--;
            }
        }
        return numbers[left];
}

在这里插入图片描述

总结

感觉暴力法好简单呀哈哈哈

最后,我想在这里记录一下我的生活:
最近我早上是5点四十起床
看到了早晨六点的教室,晚上是十点回宿舍,因为阿姨会赶人呜呜呜~
在这里插入图片描述
还找到了一个一起努力的学长,突然感觉自己也挺幸福的呀,看看我们之间的对话:
在这里插入图片描述
所以小猪猪一定要往前冲呀!!!!!!!
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:24:08  更:2021-09-06 11:24:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:34:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码