题目本身暴力法遍历数组即可求解,但其时间复杂度相对而言较大,且根据旋转数组的特点,可知时间复杂度还有减小的余地,即主体采用二分法。特殊情况,则专门考虑遍历。
整体程序虽增多,但其时间复杂度却降低了。
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]; } };