タイトル説明
回転された順序付けられた配列を考えると、事前に配列がどれだけ回転されたかはわかりません
(たとえば、0 1 2 4 5 67は45 6 7 0 1 2になる可能性があります)。
指定されたターゲットを検索します。配列内の値。配列内で見つかった場合はそのインデックスを返し、それ以外の場合は-1を返します。
配列に重複がないと仮定します。
[3,2,1],1
例1
入る
[1],0
戻り値
-1
例2
入る
[3,2,1],1
戻り値
2
アイデア:真ん中の数字が右端の数字よりも小さい場合は、右半分が順番になります。真ん中の数字が右端の数字よりも大きい場合は、左半分が順番になります。最初と最後の2つだけを使用する必要があります。順序付けられた半分で。ターゲット値がこの領域にあるかどうかを判別するための配列。これにより、保持する半分を判別できます。
コードの実装:
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int left = 0, right = len-1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < nums[right]){
if(nums[mid] < target && target <= nums[right])
left = mid+1;
else
right = mid-1;
}
else{
if(nums[left] <= target && target < nums[mid])
right = mid-1;
else
left = mid+1;
}
}
return -1;
}
}