题目本身暴力法遍历数组即可求解,但其时间复杂度相对而言较大,且根据旋转数组的特点,可知时间复杂度还有减小的余地,即主体采用二分法。特殊情况,则专门考虑遍历。
整体程序虽增多,但其时间复杂度却降低了。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
/*int n = rotateArray.size();
int i = 0, j = 0;
for (i = 0; i <= n - 2; i++) {
j = i + 1;
if (rotateArray[i] > rotateArray[j]) {
break;
}
}
if (i == n - 1)
return rotateArray[0];
else
return rotateArray[j];*/
int n = rotateArray.size();
int i = 0, j = n - 1, mid;
if (rotateArray[i] < rotateArray[j])
return rotateArray[i];
while (i <= j) {
if (j - i == 1) {
mid = j;
break;
}
mid = i + (j - i) / 2;
if (rotateArray[i] == rotateArray[mid] && rotateArray[mid] == rotateArray[j])
return Minrott(rotateArray); //特殊情况专门遍历
if (rotateArray[mid] >= rotateArray[i])
i = mid;
else
j = mid;
}
return rotateArray[mid];
}
int Minrott(vector<int> rotateArray) {
int n = rotateArray.size(), j;
for (int i = 0; i < n - 1; i++) {
j = i + 1;
if (rotateArray[i] > rotateArray[j])
break;
}
return rotateArray[j];
}
};
京公网安备 11010502036488号