二分查找

题目

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

示例1:

输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true

示例2:

输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false

题解

1
2
3
4
5
6
7
# 方法一:利用in判读元素是否存在于列表中
class Solution:
def search(self, nums, target) -> bool: # List[int] ,target:int
if target in nums:
return True
else:
return False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
def search(self, nums, target):
l = 0
r = len(nums) - 1
while l<=r:
mid = (l+r) // 2
if nums[mid] == target:
return True

if nums[mid] == nums[l]: # l和mid重复,l加一
l += 1
elif nums[mid] == nums[r]: # mid和r重复,r减一
r -= 1
elif nums[mid] > nums[l]: # l到mid是有序的,判断target是否在其中
if nums[l] <= target < nums[mid]: # target在其中,选择l到mid这段
r = mid - 1
else: # target不在其中,扔掉l到mid这段
l = mid + 1
elif nums[mid] < nums[r]: # mid到r是有序的,判断target是否在其中
if nums[mid] < target <= nums[r]:
l = mid + 1
else:
r = mid - 1
return False
1
2
3
4
5
a= Solution()
nums = [2,5,6,0,0,1,2]
target = 3
result= a.search(nums,target)
print(result)
False