博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]153.Find Minimum in Rotated Sorted Array
阅读量:6377 次
发布时间:2019-06-23

本文共 4569 字,大约阅读时间需要 15 分钟。

【题目】

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

【分析】

剑指Offer中有这道题目的分析。这是一道二分查找的变形的题目。

旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素(本题目中明确要求没有重复的元素)

注意到实际上最小的元素就是两个子数组的分界线。本题目给出的数组一定程度上是排序的,因此我们试着用二分查找法寻找这个最小的元素。

思路:

(1)我们用两个指针left,right分别指向数组的第一个元素和最后一个元素。按照题目的旋转的规则,第一个元素应该是大于最后一个元素的(没有重复的元素)。

但是如果不是旋转,第一个元素肯定小于最后一个元素。

(2)找到数组的中间元素。

中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针left指向中间元素。

移动之后,第一个指针仍然位于前面的递增数组中。

中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。

移动之后,第二个指针仍然位于后面的递增数组中。

这样可以缩小寻找的范围。

(3)按照以上思路,第一个指针left总是指向前面递增数组的元素,第二个指针right总是指向后面递增的数组元素。

最终第一个指针将指向前面数组的最后一个元素,第二个指针指向后面数组中的第一个元素。

也就是说他们将指向两个相邻的元素,而第二个指针指向的刚好是最小的元素,这就是循环的结束条件。

【代码】

/**********************************   日期:2015-01-31*   作者:SJF0115*   题目: 153.Find Minimum in Rotated Sorted Array*   网址:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/*   结果:AC*   来源:LeetCode*   博客:**********************************/#include 
#include
#include
using namespace std;class Solution {public: int findMin(vector
&num) { int size = num.size(); int left = 0,right = size - 1; int mid = 0; // num[left] > num[right] 确保旋转 while(num[left] > num[right]){ // 分界点 if(right - left == 1){ mid = right; break; }//if mid = left + (right - left) / 2; // 中间元素位于前面的递增子数组 // 此时最小元素位于中间元素的后面 if(num[mid] > num[left]){ left = mid; }//if // 中间元素位于后面的递增子数组 // 此时最小元素位于中间元素的前面 else{ right = mid; } }//while return num[mid]; }};int main(){ Solution solution; //vector
num = {0,1,2,3,4,5}; vector
num = {4,5,6,7,0}; int result = solution.findMin(num); // 输出 cout<
<

【温故】

/*---------------------------------------*   日期:2015-04-24*   作者:SJF0115*   题目: 153.Find Minimum in Rotated Sorted Array*   网址:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/*   结果:AC*   来源:LeetCode*   博客:-----------------------------------------*/#include 
#include
#include
using namespace std;class Solution {public: int findMin(vector
&num) { int size = num.size(); int left = 0,right = size - 1; // 正序 if(num[left] <= num[right]){ return num[left]; }//if int mid = 0; while(left < right){ if(right - left == 1){ return num[right]; }//if mid = left + (right - left) / 2; // 中间元素位于前面的递增子数组 // 此时最小元素位于中间元素的后面 if(num[mid] > num[left]){ left = mid; }//if // 中间元素位于后面的递增子数组 // 此时最小元素位于中间元素的前面 else{ right = mid; }//else }//while }};int main(){ Solution solution; vector
num = {0,1,2,3,4,5}; //vector
num = {4,5,6,7,1,2,3}; int result = solution.findMin(num); // 输出 cout<
<

【温故】

/*---------------------------------------*   日期:2015-07-20*   作者:SJF0115*   题目: 153.Find Minimum in Rotated Sorted Array*   网址:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/*   结果:AC*   来源:LeetCode*   博客:-----------------------------------------*/class Solution {public:    int findMin(vector
&rotateArray) { int size = rotateArray.size(); if(size == 0){ return -1; }//if if(size == 1){ return rotateArray[0]; }//if // 递增排序的 if(rotateArray[0] < rotateArray[size-1]){ return rotateArray[0]; }//if int left = 0,right = size - 1; // 二分查找 while(left <= right){ int mid = left + (right - left) / 2; // [left,mid]有序[mid,right]无序 if(rotateArray[mid] > rotateArray[left]){ left = mid; }//if // [left,mid]无序[right,end]有序 else if(rotateArray[mid] < rotateArray[left]){ right = mid; }//else else{ return rotateArray[mid+1]; }//else }//while }};

你可能感兴趣的文章
为npm配置taobao源
查看>>
zookeeper初探三 java客户端连接
查看>>
管理邮件用户
查看>>
如何查看linux版本
查看>>
导出DC数据以便以介质方式安装另一台域控制器
查看>>
Hibernate学习(八):检索方式
查看>>
RIPv1 PK RIPv2
查看>>
基于WorsPress+Xampp搭建博客
查看>>
javascript的一些基本概念
查看>>
关于Tomcat上请求的编解码问题
查看>>
WPF“动画序列”框架的初步研究与实现(附源码)
查看>>
Windows Server 2008 多元密码策略配置
查看>>
.NET中的泛型和Java泛型中的类型擦除
查看>>
白利用的集大成者:新型远控木马上演移形换影大法
查看>>
2017必备的八款最佳反勒索软件工具
查看>>
从Effective Java总结一些有助安卓开发的建议
查看>>
以一当十的程序员不是传说
查看>>
Vizinex RFID 和Brady SmartID推出航空标签
查看>>
Facebook 否认趋势话题存在政治偏见,但将做出调整
查看>>
云纵发布“纵横客“ 新一代互联网CRM开启餐饮行业营销新模式
查看>>