検索回転アレイをソート(検索イン回転ソートアレイ)

検索回転アレイをソート(検索イン回転ソートアレイ)

アレイは、以前は未知点で回転させたに従って昇順と仮定する。
(例えば、アレイ[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
公開された151元の記事 ウォン称賛47 ビュー23万+

おすすめ

転載: blog.csdn.net/e891377/article/details/103792448