検索回転アレイをソート(検索イン回転ソートアレイ)
アレイは、以前は未知点で回転させたに従って昇順と仮定する。
(例えば、アレイ[0,1,2,4,5,6,7]
になるかもしれ[4,5,6,7,0,1,2]
)。
標的配列、そのインデックスリターンの存在は、それ以外の場合は-1を返す場合、与えられた目標値を検索します。
あなたは、配列要素が重複して存在しないと仮定することができます。
アルゴリズムのあなたの時間の複雑さはO(ログn)のレベルでなければなりません。
例1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
例2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
コードやアイデア
配列のいずれかを注文しなければならない、2分割され、他方が注文することができる、それが部分的に順序付けすることができます。このセクションでは、秩序ある二分法を探してください。そしてその後、特定の順序、別の可能な順序が乱れてもよい二つの部分障害、に分割されます。サイクルそう。
#include <stdio.h>
#include <vector>
class Solution {
public:
int search(std::vector<int>& nums, int target) {
int begin = 0;
int end = nums.size() - 1;
while(begin <= end){
int mid = (begin + end) / 2;
if (target == nums[mid]){
return mid;
}
else if (target < nums[mid]){
if (nums[begin] < nums[mid]){
if (target >= nums[begin]){
end = mid - 1;
}
else{
begin = mid + 1;
}
}
else if (nums[begin] > nums[mid]){
end = mid -1;
}
else if (nums[begin] == nums[mid]){
begin = mid + 1;
}
}
else if (target > nums[mid]){
if (nums[begin] < nums[mid]){
begin = mid + 1;
}
else if (nums[begin] > nums[mid]){
if (target >= nums[begin]){
end = mid - 1;
}
else{
begin = mid + 1;
}
}
else if (nums[begin] == nums[mid]){
begin = mid + 1;
}
}
}
return -1;
}
};
int main(){
int test[] = {9, 12, 15, 20, 1, 3, 6, 7};
std::vector<int> nums;
Solution solve;
for (int i = 0; i < 8; i++){
nums.push_back(test[i]);
}
for (int i = 0; i < 22; i++){
printf("%d : %d\n", i, solve.search(nums, i));
}
return 0;
}
python3ソリューション
class Solution:
def search(self, nums: List[int], target: int) -> int:
return nums.index(target) if target in nums else -1