第六十九题(旋转数组中的最小元素)
2014-07-08 10:44
218 查看
69.旋转数组中的最小元素。
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个
排好序的数组的一个旋转,
输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数
组的最小值为1。
思路:采用一次遍历求最小值复杂度O(n),通过利用数组有序这个特点采用二分查找的方式能达到O(logn)复杂度。
数组为升序序列的旋转,分两种情况:
当旋转数目不为0时,数组中存在两个递增序列,并且前面的递增序列中的数都大于后面的序列,采用二分查找方法时,当data[mid]大于data[begin]时,说明mid位于第一个递增序列中,最小值必然在mid后面,故将begin置为mid+1,当data[mid]小于等于data[begin]时,说明mid必然位于第二个递增序列,最小值在其和begin之间,故将end置为mid,循环执行直到begin和end之间只有一个元素时,该元素就是最小值。
当旋转数目为0时(通过data[begin] < data[end]判断),数组就是一个升序序列,在这种情况下,直接返回data[begin]。
具体代码如下:
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个
排好序的数组的一个旋转,
输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数
组的最小值为1。
思路:采用一次遍历求最小值复杂度O(n),通过利用数组有序这个特点采用二分查找的方式能达到O(logn)复杂度。
数组为升序序列的旋转,分两种情况:
当旋转数目不为0时,数组中存在两个递增序列,并且前面的递增序列中的数都大于后面的序列,采用二分查找方法时,当data[mid]大于data[begin]时,说明mid位于第一个递增序列中,最小值必然在mid后面,故将begin置为mid+1,当data[mid]小于等于data[begin]时,说明mid必然位于第二个递增序列,最小值在其和begin之间,故将end置为mid,循环执行直到begin和end之间只有一个元素时,该元素就是最小值。
当旋转数目为0时(通过data[begin] < data[end]判断),数组就是一个升序序列,在这种情况下,直接返回data[begin]。
具体代码如下:
namespace MS100P_69 { int minOfRotate(int data[], int length) { int begin = 0, end = length - 1; int mid = (begin + end) / 2; while (end > begin) { if (data[begin] < data[end]) //特殊情况,此时无旋转 return data[begin]; if (data[mid] >= data[begin]) //mid位于前半部分的递增序列中 begin = mid + 1; else //mid位于第二个递增序列中 end = mid; mid = (begin + end) / 2; } return data[begin]; } void test() { int data[] = {4,5,6,1,2,3}; cout << minOfRotate(data, 6); } }
相关文章推荐
- 旋转数组的最小元素
- 旋转数组的最小元素
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
- 42.旋转数组的最小元素[Get min value of rotated array]
- 旋转数组中的最小元素
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 旋转数组的最小元素
- 程序员面试之 二分搜索 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组中的最小元素
- 微软等数据结构+算法面试100题(40)-- 旋转数组中的最小元素
- 旋转数组的最小元素
- 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素
- 求旋转数组的最小元素
- 旋转数组的最小元素
- 面试训练旋转数组的最小元素
- 旋转数组的最小元素
- 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转。输出旋转数组的最小值。
- 查找旋转数组中的最小值元素(剑指offer8)
- 程序员面试题精选100题(42)-旋转数组的最小元素