旋转数组的最小数字
2016-06-15 22:14
176 查看
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们成为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转。
旋转数组可以分为两个排序的子数组,前面子数组的元素都大于或者等于后面子数组的元素。最小的子数组刚好是这两个子数组的分界线。可以用二分查找实现排序数组的查找。
思路:1、定义两个指针,一个指向数组的第一个元素,一个指向数组的最后一个元素。
2、找到数组中间的元素,如果中间的元素大于或等于第一个元素,把第一个指针指向中间的元素。因为数组中最小的数字位于该中间元素的后面。移动之后,第一个指针仍然指向前面的递增子数组中; 如果中间的元素小于或等于最后一个元素,把第二个指针指向中间的元素。因为数组中最小的数字位于该中间元素的前面。移动之后,第二个指针仍然指向后面的递增子数组中。
3、重复第二步直到两个指针指向两个相邻的数字,第二个指针指向的数字就是数组中最小的数字。此时,第一个指针指向前面递增数组最后一个元素,第二个指针指向后面递增数组第一个元素。
旋转数组可以分为两个排序的子数组,前面子数组的元素都大于或者等于后面子数组的元素。最小的子数组刚好是这两个子数组的分界线。可以用二分查找实现排序数组的查找。
思路:1、定义两个指针,一个指向数组的第一个元素,一个指向数组的最后一个元素。
2、找到数组中间的元素,如果中间的元素大于或等于第一个元素,把第一个指针指向中间的元素。因为数组中最小的数字位于该中间元素的后面。移动之后,第一个指针仍然指向前面的递增子数组中; 如果中间的元素小于或等于最后一个元素,把第二个指针指向中间的元素。因为数组中最小的数字位于该中间元素的前面。移动之后,第二个指针仍然指向后面的递增子数组中。
3、重复第二步直到两个指针指向两个相邻的数字,第二个指针指向的数字就是数组中最小的数字。此时,第一个指针指向前面递增数组最后一个元素,第二个指针指向后面递增数组第一个元素。
#include<iostream> using namespace std; int Min(int* arr,int begin,int end) { int result = arr[begin]; for (int i = begin + 1; i <= end; ++i) { if (result > arr[i]) { result = arr[i]; } } return result; } int GetMin(int *arr, int len) { if (arr == NULL || len <= 0) { return 0; } int begin = 0; //指向数组第一个数字 int end = len - 1;//指向数组最后一个数字 int mid = begin; while (arr[begin] >= arr[end]) { //当两个指针指向两个相邻的数字时,end指向的数字就是数组中最小的数字 if (end - begin == 1) { mid = end; break; } mid = (begin+end) / 2; //如果第一个指针、第二个指针和中间元素相同时,必须顺序查找 if (arr[begin] == arr[end] && arr[mid] == arr[begin]) { return Min(arr,begin,end); } //如果中间数字大于第一个数字,begin指向中间数字 if (arr[mid] >= arr[begin]) begin = mid; //如果中间数字小于最后一个数字,end指向中间数字 else if (arr[mid] <= arr[end]) end = mid; } return arr[mid]; } int main() { //int arr[] = {3,4,5,1,2}; int arr[] = {1,1,1,0,1}; int len = sizeof(arr) / sizeof(arr[0]); int ret = GetMin(arr,len); cout << ret << endl; return 0; }
相关文章推荐
- 关于指针的一些事情
- C# Pointer指针应用实例简述
- C和指针小结(推荐)
- C++智能指针实例详解
- C++二分查找在搜索引擎多文档求交的应用分析
- 浅谈C++指针(必看)
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅谈c/c++中使用指针需要注意的问题
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- 深入理解c++指针的指针和指针的引用
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]