力扣刷题Day 71:搜索旋转排序数组(33)
1.题目描述
2.思路
首先用分治法找到数组前半段和后半段的衔接处separate,若target刚好在nums[: separate]或nums[separate + 1 :]里则在对应区间里二分查找target,否则直接返回-1。
3.代码(Python3)
方法1:
class Solution:def search(self, nums: List[int], target: int) -> int:def search_separate(left, right):if left > right: return -1elif left == right and nums[left] == target: return leftmid = (left + right) // 2if mid + 1 == len(nums): return -1if nums[mid] > nums[mid + 1]: return midseparate = search_separate(left, mid - 1)if separate == -1: separate = search_separate(mid + 1, right)return separateseparate = search_separate(0, len(nums) - 1)print(separate)if separate == -1: separate = len(nums) - 1 # nums没有旋转的情况elif nums[separate] == target: return separateelif target < nums[separate + 1] or target > nums[separate]: return -1left, right = 0, separateif separate != len(nums) - 1 and target <= nums[-1]: left, right = separate + 1, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target: return midelif nums[mid] > target: right = mid - 1else: left = mid + 1return -1
4.执行情况
方法1:
5.感想
我写的方法虽然执行效果还可以,但代码可读性极差,是在一次一次通不过测试用例的过程中不断修补的,所以看起来非常东拼西凑,差评!但是今天没有耐心再看大佬的题解了,就这样吧。