旋转数组的最小值

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

 1 class Solution {
 2 public:
 3     int minNumberInRotateArray(vector<int> rotateArray) {
 4         if(rotateArray.empty())
 5             return 0;
 6         int index1 = 0;
 7         int index2 = rotateArray.size()-1;
 8         int indexMid = index1;
 9         while(rotateArray[index1] >= rotateArray[index2]){
10             // quit condition
11             if(index2 - index1 == 1){
12                 indexMid = index2;
13                 break;
14             }
15             indexMid = (index1 + index2) / 2;
16             //the three numbers are equal
17             if(rotateArray[index1] == rotateArray[index2]
18               && rotateArray[indexMid] == rotateArray[index1]){
19                 return MinInOrder(rotateArray,index1,index2);
20             }
21             //no equal
22             if(rotateArray[indexMid] >= rotateArray[index1]){
23                 index1 = indexMid;
24             }
25             else if(rotateArray[indexMid] <= rotateArray[index2]){
26                 index2 = indexMid;
27             }
28         }
29         return rotateArray[indexMid];
30     }
31
32     int MinInOrder(vector<int> rotateArray,int index1,int index2){
33         int result = rotateArray[index1];
34         for(int i=index1+1;i<=index2;i++){
35             if(result > rotateArray[i])
36                 result = rotateArray[i];
37         }
38         return result;
39     }
40 };
时间: 2024-08-12 06:10:09

旋转数组的最小值的相关文章

查找旋转数组的最小值

查找旋转数组的最小值: 假设一个排序数组以某个未知元素为支点做了旋转,找出旋转后数组中的最小值,假定数组中没有重复元素. 如:原数组1,2,3,4,5,6,7旋转后得到4,5,6,7,1,2,3.旋转后的最小值为1. 问题分析: 这里不做过多的介绍,旋转之后的数组实际上可以划分为两个有序的数组,前面子数组的大小大于后面子数组的大小. 最小的元素就是两个数组的分界线. 程序实现: 1 /*************************************** 2 FileName FindM

旋转数组求最小值

看的网上有个叫做旋转数组的东西,所以查了查.所谓旋转数组就是把一个有序数组转动n位得到的一个东西.例如下图旋转后的a数组 一共查到了两个问题 1.把一个有序数组按照一个长度,旋转 m.获得一个旋转数组    http://blog.csdn.net/lalor/article/details/7961323      这个帖子没看明白c++的rotate怎么就高效了??? 2.旋转数组求最小值      http://zhedahht.blog.163.com/blog/static/25411

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

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入描述 一个非递减序列的一个旋转数组 输出描述 输出旋转数组的最小元素 题目分析 原数组最小的值必然是第一个,旋转后数组是两个非递减数组的拼接,只要找到第二个非递减数组的第一个元素就是最小值.具体思路就是用二分查找算法.然后考虑特殊情况[1,1,1,1,1]遍历完没有结果,在最后

剑指offer:旋转数组的最小值

题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. class Solution: """ 由于整个数组在一定程度上是有序的,因此可以借鉴二分查找的思想,达到接近O(logn)的时间复杂度. 将一个有序(升序)数组的前x个元素挪到末尾,这里可以分

求旋转数组的最小值

思路: 基本方法:从头遍历一遍,时间复杂度为O(n),效率比较低,这里采用二分查找,找出中间元素与头,尾比较,如果中间元素比头元素大,说明这部分有序,最小值在后半部分,中间元素为头:如果中间元素比尾元素大,说明最小值在前部分. 设定两个指针start和end分别指向数组的首尾元素,然后当start指向前半段最后一个元素,end指向后半段第一个元素,这是程序就找到了数组中的最小元素,就是end指向的那个数,程序的出口就是 end-start==1. #include<stdio.h> #incl

153 Find Minimum in Rotated Sorted Array 旋转数组的最小值

假设一个按照升序排列的有序数组从某未知的位置旋转.(比如 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2).找到其中最小的元素.你可以假设数组中不存在重复的元素.详见:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/ class Solution { public: int findMin(vector<int>& nums) { int low=0; int

旋转数组中查找最小值-剑指Offer11

1.题目简介 求一个旋转数组的最小值.( 把一个数组从最开始的若干个元素搬到数组的末尾,即为旋转数组.) 输入:一个递增排序数组的旋转 输出:数组的最小值 例子:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 2.思路分析 最直观的解法是从头到尾顺序遍历,这种方法的时间复杂度为O(n).这里并没有用到旋转数组的知识,显然不合题意. 结合提议,旋转数组从有序数组中的得来的,经过旋转后得到的两个部分也为有序的.在有序数组中查找首选二分法,可以把时间复杂度变为O(n

[数组]旋转数组

旋转数组起始就是数组元素的循环左移或者循环右移.例如:{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组.旋转数组是在非降序数组的基础上得到的,所以数组原本应该是有序的. 有序数组到旋转数组 如果真的利用循环左移或者循环右移来实现旋转数组,那么将有大量的元素要移动,所以一个好的方法要尽量的减少数组中元素的移动. 方法: 1.对数组的前部分元素做逆序操作 2.对数组的后部分元素做逆序操作 3.对数组的所有元素整体做逆序操作 逆序操作利用两个指针,一个头指针一个尾指针,都往中间移动,一次交

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

题目总结: 1.若没有进行旋转,或者说旋转后的效果跟没有旋转是一样的,那么index1指示的值小于index2指示的值,返回index1的值. 2.若是一般性的旋转,那么最小的值旋转后肯定在中间,那么我们就可以从两边向中间夹逼. 3.夹逼的过程中,若 [ index1, middle ] 是有序的,说明这部分子区间没被破坏,旋转所移动的元素都在middle 的后面,那么最小值可定也在后面的部分,令 index1 = middle,继续向后夹逼:同理,若 [ middle ,index2 ] 是有