新手讲算法 旋转数组中最小的数
//分析:非递减排序数组 前面一部分 挪到后面,则形成了 两个非递减排序的数组,
//而:最小的元素一定出现在 第二个非递减排序的数组中
//所以这个题:我们要找出 两个非递减的边界,当 end - start == 1时,条件中指,end就是找到的元素
//(1)我们用两个指针,第一个指针,指向 第一个元素 start , 第二个指针 指向 最后一个元素 end。找到 中间的元素 mid
//(2) mid == start && mid == end。 则无法分辨 最小数,在前面还是在后面,则我们遍历 start—>end 去找
//(2) mid >= start, 则说明 mid 处在第一个 递减数组中,则 最小数 在 mid 之后,此时范围 mid->end
//(3)mid <= end, 说明 mid 处在第二个递减数组中, 则 最小数 在 mid 之前,此时范围: start -> end
class Solution {
public:
int minNumberInRotateArray(vector<int> a) {
int start = 0;
int end = a.size() - 1;
int mid = (start + end) / 2;
while( a[end] <= a[start]) {
if(end - start == 1) {
return a[end];
}
mid = (start + end) / 2;
if(a[mid] == a[start] && a[mid] == a[end]) {
int min = a[start];
for(int i = start; i <= end; i++) {
if(a[i] < min) {
min = a[i];
}
}
return min;
}
if(a[mid] >= a[start]) {
//说明mid在第一个数组中
start = mid;
} else {
end = mid;
}
}
return 0;
}
};

浙公网安备 33010602011771号