class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int left = 0; int right = rotateArray.size() - 1; while(left < right){ int mid = (left + right) / 2; //最小的数字在mid右边 if(rotateArray[mid] > rotateArray[right]) left = mid + 1; //无法判断,一个一个试 else if(rotateArray[mid] == rotateArray[right]) right--; //最小数字要么是mid要么在mid左边 else right = mid; } // 最终left应该等于right,所在return rotateArray[left] 或 rotateArray[right]都行; // return rotateArray[left]; return rotateArray[right]; } }; // class Solution { // public: // /** // * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 // * // * // * @param nums int整型vector // * @return int整型 // */ // int minNumberInRotateArray(vector<int>& nums) { // // write code here // // 旋转后数组变成两部分非降序数组 // // 二分查找 // // 补充:特殊情况 // if (nums.size()== 0) { // return 0; // } // int left=0, right=nums.size()-1; // while(left<right) // { // // 找到数组的中点 m // int mid = (right+left)>>1; // // m在左排序数组中,旋转点在 [mid+1, right] 中 // if(nums[mid]>nums[right]) // left = mid+1; // // m 在右排序数组中,旋转点在 [left, mid]中 // else if(nums[mid]<nums[right]) // right = mid; // // 缩小范围继续判断 // else // --right; // } // return nums[left]; // } // };