【数学】【数组】旋转数组求最小值

来源:互联网 发布:真人卡通头像制作软件 编辑:程序博客网 时间:2024/05/22 17:27

题目:来自脑客爱刷题

一个有序的数组arr可能经过一次旋转处理也可能没有。
例如:有序数组{1,2,3,4,5,6,7},可以旋转处理为:{4,5,6,7,1,2,3}等等。
请在这种的数组中找到最小的数。

提示:尽可能使用二分查找,该解法为最优解。

int FindMinNumber(const int* num, int len){if (num == nullptr || len <= 0)throw new std::exception("Invaalid parameters");if (len == 1)return num[0];int left = 0;int right = len - 1;while (left < right){if (left == right - 1)//真的有必要???break;if (num[left] < num[right])//没有旋转return num[left];int mid = (left + right) / 2;if (num[mid] < num[left])//断点在左侧,可能是mid{right = mid;continue;}if (num[mid] > num[right])//断点在右侧,不可能是mid{left = mid + 1;continue;}//此时left==mid==rightleft++;while (left < mid){if (num[left] == num[left - 1]){left++;}else if (num[left] < num[left - 1])//left为断点return num[left];else //if (num[left] > num[left - 1])断点在右侧,断点不可能是left{left++;//因为断点不可能是left,所以右移一位right = mid;break;}}}return min(num[left], num[right]);}


0 0
原创粉丝点击