トピック
降順ではない整数配列 nums が存在することが知られており、配列内の値は互いに異なる必要はありません。
関数に渡される前に、配列が [nums[k], nums[k+1], …, nums[ n-1], nums[0], nums[1], …, nums[k-1]] (添え字は 0 から数え始めます)。たとえば、[0,1,2,4,4,4,5,6,6,7] は [4,5,6,6,7,0,1,2, 4,4] になります。
ローテーションされた配列 nums と整数ターゲットを指定して、指定されたターゲット値が配列に存在するかどうかを判断する関数を作成してください。ターゲット値 target が nums に存在する場合は true を返し、そうでない場合は false を返します。
操作手順全体を可能な限り最小限に抑える必要があります。
例 1:
入力: 数値 = [2,5,6,0,0,1,2]、ターゲット = 0
出力: true
例 2:
入力: 数値 = [2,5,6,0,0,1,2]、ターゲット = 3
出力: false
ヒント:
1 <= nums.length <= 5000
-104 <= nums[i] <= 104
タイトル データは、nums が未知の添字でローテーションされることを保証します
-104 <= ターゲット <= 104
高度:
これは、nums に重複した要素が含まれている可能性がある、回転された並べ替えられた配列を検索する拡張トピックです。
これはプログラムの時間の複雑さに影響しますか? どのような影響があり、その理由は?
答え
疑似バイナリ検索を使用して、
mid の左右に順序付けされた側が必要であることを確認します。
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left<=right)
{
int mid = left + ((right-left)>>1);
if(nums[mid] == target)
return true;
if(nums[left] == nums[mid] && nums[mid] == nums[right])
{
left++;
right--;
}
else if(nums[left]<=nums[mid])
{
if(nums[left]<=target && target<nums[mid])
{
right = mid-1;
}
else
{
left = mid+1;
}
}
else if(nums[mid]<=nums[right])
{
if(nums[mid]<target && target<=nums[right])
{
left = mid+1;
}
else
{
right = mid-1;
}
}
}
return false;
}
};