《剑指offer》面试题8—旋转数组的最小数字
2013-09-09 22:01
681 查看
题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转。要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字。例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。
思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点。由于是局部有序的,想到用二分查找的方法去查找最小元素。和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面;如果该数小于index2,则说明最小数在该数前面或者就是该数。
例外情况:1.旋转了0个数,即数组仍是有序的;2.mid=index1=index2,此时必须暴力求解。
View Code
思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点。由于是局部有序的,想到用二分查找的方法去查找最小元素。和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面;如果该数小于index2,则说明最小数在该数前面或者就是该数。
例外情况:1.旋转了0个数,即数组仍是有序的;2.mid=index1=index2,此时必须暴力求解。
#include <iostream> using namespace std; int MinInOrder(int* array, int index1, int index2) { int min = array[index1]; for(int i=index1+1; i<=index2; i++) { if(array[i] < min) min = array[i]; } return min; } int Min(int* array, int length) { int index1 = 0; int index2 = length - 1; int index_mid = index1; if(array[index1] < array[index2]) return array[index1]; else { while((index2 - index1) > 1) { index_mid = (index2 + index1)/2; if(array[index1] == array[index2] == array[index_mid]) return MinInOrder(array,index1,index2); else if(array[index1] <= array[index_mid]) index1 = index_mid; else index2 = index_mid; } } return (array[index1]<array[index2])?array[index1]:array[index2]; } int main() { int length; cout<<"Input the array's length:"<<endl; cin>>length; int* parray = new int[length]; for(int i=0; i<length; i++) { cin>>parray[i]; } cout<<"The min number in array:"<<Min(parray,length)<<endl; return 0; }
View Code
相关文章推荐
- (未完成)《剑指offer》(面试题8):旋转数组的最小数字
- 剑指Offer面试题:7.旋转数组的最小数字
- 《剑指Offer》学习笔记--面试题8:旋转数组的最小数字
- 剑指offer面试题8——旋转数组的最小数字
- 《剑指offer》面试题11:旋转数组的最小数字
- 剑指offer之面试题8旋转数组的最小数字
- 剑指Offer面试题11:旋转数组的最小数字
- 《剑指offer》面试题8 旋转数组的最小数字
- 《剑指Offer》之面试题旋转数组的最小数字
- 剑指Offer:面试题8 :旋转数组的最小数字
- 面试题08_旋转数组的最小数字——剑指offer系列
- 剑指offer 面试题8:旋转数组的最小数字 题解
- 剑指offer面试题八:旋转数组的最小数字
- (剑指Offer)面试题8:旋转数组的最小数字
- 《剑指Offer》面试题8:旋转数组的最小数字
- 剑指Offer面试题8(java版):旋转数组的最小数字
- 《剑指Offer》面试题:旋转数组的最小数字
- 剑指Offer系列-面试题8:旋转数组的最小数字
- 《剑指Offer》面试题八之旋转数组的最小数字
- 剑指Offer之面试题8:旋转数组中的最小数字