查找旋转数组的最小值

查找旋转数组的最小值:

假设一个排序数组以某个未知元素为支点做了旋转,找出旋转后数组中的最小值,假定数组中没有重复元素。

如:原数组1,2,3,4,5,6,7旋转后得到4,5,6,7,1,2,3。旋转后的最小值为1。

问题分析:

这里不做过多的介绍,旋转之后的数组实际上可以划分为两个有序的数组,前面子数组的大小大于后面子数组的大小。

最小的元素就是两个数组的分界线。

程序实现:

 1 /***************************************
 2 FileName FindMinRotateArray.cpp
 3 Author : godfrey
 4 CreatedTime : 2016/5/3
 5 ****************************************/
 6 #include <iostream>
 7 #include <cstring>
 8 #include <vector>
 9 #include <algorithm>
10 #include <stdio.h>
11 #include <stdlib.h>
12
13 using namespace std;
14
15 int FindMinRotateArray(int* A,int size){
16     int Low = 0;
17     int High = size-1;
18     int mid;
19     while(Low < High){
20         mid = (Low + High) / 2;
21         if(A[mid] > A[High]){ //最小值在右半部份
22             Low = mid + 1;
23         }
24         else if(A[mid] < A[High]){//最小值在左半部分
25             High = mid;
26         }
27     }
28     return A[Low];
29 }
30 int main()
31 {
32     int a[] = {4,5,6,7,1,2,3};
33     int FindMinNum = FindMinRotateArray(a,sizeof(a)/sizeof(int));
34     cout<<"the FindMinNum: ";
35     cout<<FindMinNum<<endl;
36     return 0;
37 }

运行结果:

转载请注明出处:

C++博客园:godfrey_88

http://www.cnblogs.com/gaobaoru-articles/

时间: 2024-08-24 23:22:31

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

剑指offer java -查找旋转数组的最小数字

/** * Created by wqc on 2017/7/18. * 查找旋转数组的最小数字 * 把一个数组最开始的若干个元素搬到数组的末尾,称为数组的旋转 * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素 * 如:3,4,5,1,2 为1,2,3,4,5的一个旋转,最小值为1 */public class Problem8_findMinNumber { public Integer findMinNum(int[] array) { if(array == null) { r

旋转数组求最小值

看的网上有个叫做旋转数组的东西,所以查了查.所谓旋转数组就是把一个有序数组转动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个元素挪到末尾,这里可以分

旋转数组的最小值

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

求旋转数组的最小值

思路: 基本方法:从头遍历一遍,时间复杂度为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

二分查找--循环数组找最小值

#include<iostream> using namespace std; int main() { int arr[] = {5,6,7,8,9,1,2,3,4}; int left = 0, right = 8; cout<<"循环有序数组arr[]={"; for(int i = 0; i < 9; i++) if(i != 8) cout<<arr[i]<<","; else cout<<

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

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