查找旋转数组中的最小值元素(剑指offer8)
2014-04-08 13:53
363 查看
问题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出数组旋转数组的最小元素。
例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.
补充:如果查找旋转数组中的任意元素呢?
1.蛮力法,遍历整个数组找到最小值——时间复杂度为O(n),空间复杂度为O(1).
2.根据数组的特点,遍历到第一个逆序位置即为最小值元素——时间复杂度为O(n),空间复杂度为O(1).
3.二分法查找——时间复杂度为O(logn),空间复杂度为O(1).
测试代码:
注:部分内容参考自剑指offer
例如:数组{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
相关文章推荐
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- C++ 算法 查找旋转数组中的最小值 允许重复元素
- 字符串算法——查找有序数组旋转后的最小值(无重复元素)(Find Minimum in Rotated Sorted Array)
- 字符串算法——查找有序数组旋转后最小值(有重复元素)(Find Minimum in Rotated Sorted Array II)
- 8+查找一个旋转数组的最小元素
- 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数
- 旋转数组中的最小元素
- 旋转数组中查找元素
- 剑指Offer8:旋转数组的最小数字
- Search in Rotated Sorted Array II 旋转的数组中查找,有重复元素
- 关于查找数组中最小的k个元素的解答、updated
- 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 查找数组(不限维数)中的最大元素和最小元素
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)
- 【编程题目】旋转数组中的最小元素☆
- 旋转数组中的最小元素
- 关于查找数组中最小的k个元素的解答、updated
- C语言 求旋转数组的最小元素
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。