Find Minimum in Rotated Sorted Array
我的思路:
1、在一个旋转数组中找到最小的那个数,只需要找到旋转的那个点就可以了。特殊情况没有旋转或者说旋转点在-1这个下标,返回num[0],如果只有一个数也返回num[0]。
2、由于没有重复的数,设定两个下标,从两头往中间找。当左边的值比右边小的时候停止循环。
3、如果begin == end,说明是奇数个数,我们要判断最中间的数是最大还是最小;如果不等于,说明是偶数个数或者已经错过,只需判断num[end]是在最大的 数还是最小的数。这里说得不清楚,应该有更好的判断方法。
代码如下:
int findMin(vector<int> &num) {
if (num[0] <= num[num.size() - 1])
return num[0];
int begin = 0, end = num.size() -1;
while (num[begin] > num[end]) {
begin++;
end--;
}
return num[(begin == end ? (num[begin - 1] < num[begin] ? begin : begin - 1) : (num[end] > num[end + 1] ? end : begin - 1)) + 1];
}
别人思路:
1、二分明显是可以的,下面代码来自leetcode讨论区
int findMin(vector<int> &num) {
int lo = 0, hi = num.size() - 1;
while(lo < hi){
int mid = (lo + hi) / 2;
if (num[mid] > num[hi])
lo = mid + 1;
else
hi = mid;
}
return num[lo];
}
Find Minimum in Rotated Sorted Array II
1、这题是Search in Rotated Sorted Array的基础题。只要找出最小的数就可以了。
2、对比第一个版本,改变了移动指针的方法。
我的代码:
int findMin(vector<int> &num) {
if (num.size() == 1)
return num[0];
int begin = 0, end = num.size() - 1;
while (num[begin] <= num[begin + 1] && num[end] >= num[end - 1] && end > 0) {
begin++;
end--;
}
int mid = end == 0 ? 0 : num[begin] > num[begin + 1] ? begin + 1 : end;
return num[mid];
}
别人思路:
1、依旧是可以利用二分查找的方法来做。
2、如果遇到num[mid]和num[end]一样的时候,不确定是在左边还是在右边,我们让end--。
代码如下:
int findMin(vector<int> &num) {
int begin = 0, end = num.size() - 1;
int mid = (begin + end) / 2;
while (begin < end) {
if (num[mid] > num[end])
begin = mid + 1;
else if (num[mid] < num[end])
end = mid;
else
end--;
mid = (begin + end) / 2;
}
return num[mid];
}
有些时候问题出现新的情况的时候要考虑使用新的方法去解决,不能套用老方法。