1 """
2 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
3 (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
4 You are given a target value to search. If found in the array return its index, otherwise return -1.
5 You may assume no duplicate exists in the array.
6 Your algorithm's runtime complexity must be in the order of O(log n).
7 Example 1:
8 Input: nums = [4,5,6,7,0,1,2], target = 0
9 Output: 4
10 Example 2:
11 Input: nums = [4,5,6,7,0,1,2], target = 3
12 Output: -1
13 """
14 """
15 题目要求时间复杂度为O(log n)
16 先不管这个要求。AC混一下
17 得到解法一
18 """
19 class Solution1:
20 def search(self, nums, target):
21 if target not in nums:
22 return -1
23 for i in range(len(nums)):
24 if nums[i] == target:
25 return i
26
27 """
28 真正的解法是二分法
29 主要分两种情况:
30 若nums[left]<=nums[mid],这说明前半部分是排序的
31 若nums[left]<=target<=nums[mid],在前半部分搜索,反之在后半部分搜索
32 若nums[left]>nums[mid],这说明后半部分是排序的
33 若nums[mid]<=target<=nums[right],在后半部分搜索,反之在前半部分搜索
34 一直搜索,直到left>=right
35 传送门:https://www.jianshu.com/p/7295418b260f
36 """
37 class Solution2:
38 def search(self, nums, target):
39 n = len(nums)
40 left, right = 0, n-1
41 while left < right:
42 mid = (left+right)//2
43 if nums[mid] == target:
44 return mid
45 if nums[left] <= nums[mid]: #前办部分有序
46 if nums[left] <= target <= nums[mid]:
47 right = mid
48 else:
49 left = mid + 1
50 else:#后半部分有序
51 if nums[mid] <= target <= nums[right]:
52 left = mid + 1
53 else:
54 right = mid
55 return left if nums and nums[left] == target else -1