旋转数组求最小值

看的网上有个叫做旋转数组的东西,所以查了查.所谓旋转数组就是把一个有序数组转动n位得到的一个东西.例如下图旋转后的a数组

一共查到了两个问题

1.把一个有序数组按照一个长度,旋转 m.获得一个旋转数组    http://blog.csdn.net/lalor/article/details/7961323      这个帖子没看明白c++的rotate怎么就高效了???

2.旋转数组求最小值      http://zhedahht.blog.163.com/blog/static/25411174200952765120546/

试着写了一下用二分法求最小值的代码, 没有保证一次成功,编译后通过了.但是总有种食之无味,弃之可惜的感觉.....

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4
 5 using namespace std;
 6
 7 int getMinist(const int* const sp, const int length)
 8 {
 9     int begin = 0;
10     int end = length -1;
11     int middle = (begin + end) / 2;
12
13     for (int i = 0; i <= length; i++)  //当循环了length次都没结束的话,说明代码写错啦,否则不可能找不到
14     {
15         if (begin > end) //一直没找到,
16         {
17             return -2;
18         }
19         else  //只有sp[middle]的值比左边小(如果有),同时sp[middle]的值比右边小(如果有)
20         {
21             if ( (middle == 0) && (middle + 1 < length - 1) ) //middle在最左边
22             {
23                 if (sp[middle] < sp[middle+1])
24                     return sp[middle];
25             }
26             else if ( (middle == length - 1) && (middle - 1 >= 0) ) //middle在最右边
27             {
28                 if (sp[middle] < sp[middle-1])
29                     return sp[middle];
30             }
31             else //middle在中间
32             {
33                 if ( (sp[middle] < sp[middle-1]) && (sp[middle] < sp[middle+1]) )
34                     return sp[middle];
35             }
36         }
37
38         if ( sp[middle] >= sp[end] ) //sp[middle] 比最右边的大,就移动begin
39         {
40             begin = middle + 1;
41         }
42         else if (sp[middle] < sp[end]) //sp[middle] 比最左边大端小,就移动end
43         {
44             end = middle -1;
45         }
46
47         middle = (begin+end) / 2;
48     }//for
49
50     return -1;
51 }
52
53 int main(int argc, char** argv)
54 {
55     int arry1[] = {9,8,7,6,1,2,3,4,5,6};
56     int arry2[] = {9,8,7,6,5,4,1,2,3};
57     int arry3[] = {1,2,3,4};
58     int arry4[] = {9,8,7,6,5,4,3,2,1};
59
60     cout<<getMinist(arry1,sizeof(arry1)/sizeof(arry1[0]))<<endl;
61     cout<<getMinist(arry2,sizeof(arry2)/sizeof(arry2[0]))<<endl;
62     cout<<getMinist(arry3,sizeof(arry3)/sizeof(arry3[0]))<<endl;
63     cout<<getMinist(arry4,sizeof(arry4)/sizeof(arry4[0]))<<endl;
64     return 0;
65 }
时间: 2024-11-13 17:37:10

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

查找旋转数组的最小值

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

旋转数组的最小值

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{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;

【剑指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.对数组的所有元素整体做逆序操作 逆序操作利用两个指针,一个头指针一个尾指针,都往中间移动,一次交

笔试算法题(22):二分法求旋转数组最小值 &amp; 骰子值概率

出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂度小于O(N)也就是不能用常规的遍历思路:可以将数组看成两个都是递增序列(假设为升序)的子数组,并且前半段的元素均大于等于后半段的元素,分界点的位于后半段数组的第一个元素就是最小元素: 具体算法:两个指针left和right指向数组第一个和最后一个元素,使用Binary Search确定中间元素mi