33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1
。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log 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
代码:
class Solution:
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#### the first method
# for i in range(len(nums)):
# if nums[i] == target:
# return i
# else:
# continue
# return -1
#### the second method
if len(nums) == 0:
return -1
left, right = 0 , len(nums)-1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
if nums[mid] < nums[right]:
if nums[mid] < target and target <= nums[right]:
left = mid + 1
else:
right = mid -1
else:
if nums[mid] > target and nums[left] <= target:
right = mid -1
else:
left = mid + 1
return -1
s = Solution7()
print(s.search(nums = [4,5,6,7,0,1,2], target = 0))
合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
代码:
# Definition for an interval.
class Interval:
def __init__(self, s=0, e=0):
self.start = s
self.end = e
class Solution6:
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
"""
思路:首先按照开始区间进行排序sorted,然后从第二个区间开始,
如果相邻的两个区间,当前的start小于前一个区间的end,则合并区间,
且生成新的区间,如果不小于,则返回前一个区间,具体代码如下
"""
length = len(intervals)
if length < 2:
return intervals
intervals = sorted(intervals, key = lambda x: x.start)
res = []
for i in range(1, length):
last = intervals[i-1]
now = intervals[i]
if now.start <= last.end:
now.end = max(intervals[i].end, last.end)
now.start = last.start
else:
res.append(intervals[i -1])
res.append(intervals[i])
return res