class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int len = rotateArray.size();
if(len == 0) return 0;
if(len == 1) return rotateArray[0];
int index1 = 0, index2 = len-1;
int indexMid = (index1+index2)/2;
if(rotateArray[index1] == rotateArray[index2]
&& rotateArray[index1] == rotateArray[indexMid]) {
return MinInOrder(rotateArray, index1, index2);
} else if(rotateArray[index1] >= rotateArray[index2]) {
while(index2-index1 != 1) {
indexMid = (index1+index2)/2;
if(rotateArray[indexMid] >= rotateArray[index1]) {
// indexMid位于前面序列,序列分解在后半段
index1 = indexMid;
} else if(rotateArray[indexMid] <= rotateArray[index2]) {
index2 = indexMid;
}
}
return rotateArray[index2];
} else { // rotateArray[index1] < rotateArray[index2]:原数组
return rotateArray[0];
}
}
int MinInOrder(vector<int> rotateArray, int index1, int index2) {
int result = rotateArray[index1];
for(int i=index1; i<=index2; i++) {
if(rotateArray[i] < result) {
result = rotateArray[i];
}
}
return result;
}
};
第四次过:
第一次,中文分号,哎,打完注释没改掉没注意
第二次+第三次,对算法逻辑分析不清。只有index1、index2、indexMid相等时才遍历,其它情况是正常情况。调整了if分支的顺序后通过。
此题用了二分查找的思路:与中间的数比较,确定要找的数在哪半。不同点在于二分查找与中间的数比较的数就是要查找的数,而此题比较的数是数组 头和尾。要查找的数是两个序列的分界。
反思:在分支比较多的情况下一定要自己设计测试用例检查自己的代码逻辑。
另外牛客网上的调试信息中的测试用例没显示出来呀~是个bug