intminNumberInRotateArray(vector<int> rotateArray){ if (rotateArray.size()==0) return0; int left = 0; int right = rotateArray.size()-1; int mid = 0; while (left < right) { mid = (left+right) / 2; if (rotateArray[mid] == rotateArray[right]) right -= 1; //存在相等的值,去掉最右边的一位 elseif (rotateArray[mid] < rotateArray[right]) right = mid; //右边的是正常递增的,所以断点在左边 else left = mid + 1; // 断点在右边,但是此时 rotateArray[mid] > rotateArray[right], 所以mid处的值可以抛弃,而上一中情况中mid处的值是小于其他值的,不可直接删除。 } return rotateArray[left]; }
注意,下面这种写法无法通过测试用例 {5,5,5,5,5,1,2,5},会陷入死循环中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
intminNumberInRotateArray(vector<int> rotateArray){ if (rotateArray.size()==0) return0; int left = 0; int right = rotateArray.size()-1; int mid = 0; if (rotateArray[left] < rotateArray[right]) return rotateArray[0]; while (left < right) { mid = (left+right) / 2; if (rotateArray[left] < rotateArray[right]) return rotateArray[left]; if (rotateArray[mid] > rotateArray[mid+1]) return rotateArray[mid+1]; if (rotateArray[mid] < rotateArray[left]) right = mid; if (rotateArray[mid] > rotateArray[right]) left = mid; } }