刷题笔录
作者:关注了🐴
Github:Github
掘金:进去看看🐴
爱好:Americano More Ice !
QQ学习交流群(new): 811792998
剑指Offer - 和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
解题
注意为排序数组,双指针(碰撞指针)再好不过了,思想三部曲
- 时间复杂度 O(N): N 为数组 nums 的长度;双指针共同线性遍历整个数组
- 空间复杂度 O(1) : 变量 i, j 使用常数大小的额外空间。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 1.初始化双指针
i, j = 0, len(nums)-1
# 2.循环判断
while i < j:
s = nums[i] + nums[j]
if s > target:
j-=1
elif s < target:
i+=1
else:
return [nums[i],nums[j]]
# 3.不存返回空
return []
剑指Offer - 和为s的连续正数序列II
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
解题2
不得不知的!
滑动窗口:窗口的左、右边界永远只能向右移动。是为了保证滑动窗口的时间复杂度是 O(n)。如果左右边界向左移动的话,这叫做“回溯”,算法的时间复杂度就可能不止 O(n)。
题目得是连续数组–>滑动窗口你的选择!
- 时间复杂度 O(N):target = N
- 空间复杂度 O(1) :变量 i , j , sum 使用常数大小的额外空间
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
# 初始化
i, j, sum, res = 1, 2, 3, []
# 循环
while i < j:
# 找到遍历放入res数组
if sum == target:
res.append(list(range(i, j + 1)))
# 滑动窗口 >= 目标值,左边界右移
if sum >= target:
sum -= i
i += 1
# 滑动窗口 < 目标值,右边界右移
else:
j += 1
sum += j
return res