アイデア:この
質問は実際には少し注意が必要です。これは、配列Limanの値が重複している場合です。たとえば、3,1,1,2,2,2,2,2の場合、この質問は間違いなく二分法で行われます。配列の最後の要素の境界を見つけるだけで済みますが、恐れています。特別な場合、ここでのアプローチは、分割線の端にある要素を1桁前方に移動し、前の要素を使用して分割線を見つけることです。前の要素に重複する値がある場合は、前方に移動します。
コード:
class Solution {
public:
int minArray(vector<int>& numbers) {
int i = 0, j = numbers.size() - 1;
while (i < j) {
int m = (i + j) / 2;
if (numbers[m] > numbers[j]) i = m + 1;
else if (numbers[m] < numbers[j]) j = m;
else j--;
}
return numbers[i];
}
};