您的位置:首页 > Web前端

查找旋转数组中的最小值元素(剑指offer8)

2014-04-08 13:53 363 查看
问题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出数组旋转数组的最小元素。

例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.

补充:如果查找旋转数组中的任意元素呢?

1.蛮力法,遍历整个数组找到最小值——时间复杂度为O(n),空间复杂度为O(1).

int minOfRotateArrayByTraverse(int* array, int length) {
if (NULL == array || 0 >= length) {
return 0;
}

int min = 0x7FFFFFFF; //2^31-1
for (int i = 0; i < length; ++i) {
if (min > array[i]) {
min = array[i];
}
}

return min;
}

2.根据数组的特点,遍历到第一个逆序位置即为最小值元素——时间复杂度为O(n),空间复杂度为O(1).

int minOfRotateArrayByFirstReverse(int* array, int length) {
if (NULL == array || 0 >= length) {
return 0;
}

//翻转后跟原来一样时,min是第一个元素
int min = array[0];
for (int i = 1; i < length; ++i) {
if (array[i - 1] > array[i]) {
min = array[i];
break;
}
}

return min;
}

3.二分法查找——时间复杂度为O(logn),空间复杂度为O(1).

int minOfRotateArrayByBinarySearch(int* array, int length) {
if (NULL == array || 0 >= length) {
return 0;
}

//翻转后跟原来一样时,min是第一个元素
int min = array[0];
int left = 0, right = length - 1;
int middle = left + (right - left) / 2;
while (left < right) {
//逆序的两个相邻元素的后者即为最小值
if (array[left] >= array[right] && right - left <= 1) {
min = array[right];
break;
}

middle = left + (right - left) / 2;
//如果左、中、右相等则不能用二分法查找
if (array[left] == array[middle] && array[middle] == array[right]) {
min = minOfRotateArrayByFirstReverse(array, length);
}

if (array[middle] <= array[right]) {
//mid位于后半段有序数组
right = middle;
} else if (array[middle] >= array[left]) {
//mid位于前半段有序数组
left = middle;
}
}

return min;
}


测试代码:

/*
*
*  Created on: 2014-4-8 09:04:22
*      Author: danDingCongRong
*
*/

#include<iostream>
using namespace std;

int main() {
int length = 0;
cout << "请输入数组的长度:" << endl;
while (cin >> length) {
//测试用例:{1,2,3,4,5,6},{3,4,5,6,1,2}
//测试用例:{1,2,2,3,3,1},{1,1,0,1,1,1}
//测试用例:{1,1,1,0,0,1},{6,5,4,3,2,1}

int* x = new int[length];
for (int i = 0; i < length; ++i) {
cin >> x[i];
}

cout << "遍历法min=" << minOfRotateArrayByTraverse(x, length) << endl;
cout << "数组特点min=" << minOfRotateArrayByFirstReverse(x, length) << endl;
cout << "二分法min=" << minOfRotateArrayByBinarySearch(x, length) << endl;

delete x;

cout << "请输入数组的长度:" << endl;
}

return 0;
}


注:部分内容参考自剑指offer


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐