0 题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
1 分析
首先需要找到旋转数组的开始位置。
该数组可以分为两部分,两部分都是已经排序的了。
如果使用二分,那么当arr[start]>arr[end]那么就应该在这个缺件,因为,原始数组是递增的,因此,应该是arr[start]<arr[end]。
当相同的情况时,就只能从头开始遍历了。
2 实现
直接遍历实现,没有那么多的操作
int minNumberInRotateArray(vector<int> arr) { int len = arr.size(); if (len == 0) { return 0; } for (int i = 0; i < len - 1; ++i) { if (arr[i] > arr[i + 1]) { return arr[i + 1]; } } }
通过二分确定:
int minNumberInRotateArray(vector<int> arr) { int len = arr.size(); if (len == 0) { return 0; } int end = len - 1; int start = 0; int mid; // 开始的时候赋值为 arr[start] ,避免进不了while循环, // 也就是数组并没有旋转过。返回值为空的情况 int ret = arr[start];
// 当等于的时候,使用 if 中的循环直接退化为遍历 while (arr[start] >= arr[end]) { if (end - start == 1) // 当差距只有1的时候,那么返回end。 { ret = arr[end]; break; } mid = (start + end) / 2; //二分 //判断相等的时候,也就是说例如 10111这种情况 if (arr[mid] == arr[start] && arr[mid] == arr[end]) { for (int i = start; i < end; ++i) { if (arr[i] > arr[i + 1]) { ret = arr[i + 1]; break; } } } if (arr[start] < arr[mid]) { start = mid; } else { end = mid; } } return ret; }