1.子串
1.1第560题-和为k的子数组
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
一开始想用滑动窗口,但是在运行过程中碰到了很多不好处理的例子,不好弄。就直接看解析了,决定用ij范围遍历,结果超时。
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
n = len(nums)
cur_arr = []
result = 0
cur_sum = -100000000
last_sum = 0
sum_nums = 0
for i in range(n):
sum_nums += nums[i]
cur_sum = sum_nums
sum_temp = sum_nums
for i in range(n):
if i != 0:
sum_temp -= nums[i-1]
cur_sum = sum_temp
for j in reversed(range(i,n)):
if cur_sum == k:
result += 1
cur_sum -= nums[j]
return result
看了解析,说实话挺不好想的
class Solution(object):
def subarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
n = len(nums)
cur_arr = []
result = 0
last_sum = 0
sum_nums = 0
# 必须初始化为0:1,不然sum_nums-k=0时,result就不能加一了
dic = {0:1}
for i in range(n):
# 求前缀和
sum_nums += nums[i]
# 如果字典中存在sum_nums-k,则说明sum_nums对应的i与sum_nums-k对应的i之间和为k
# 如果sum_nums-k的键值不唯一,就表示有多个i的前缀和为sum_nums-k
# 这时result就加上键值
result += dic.get(sum_nums-k, 0)
# 最后把该i的前缀和加入到字典中,若已存在则键值加一
dic[sum_nums] = dic.get(sum_nums, 0) + 1
print(dic, result)
return result
1.2第239题-滑动窗口最大值
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
心得:思路感觉挺简单,就是滑动窗口,直接写出来,不过超时了。
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
result = []
cur_win = []
for i in range(k-1):
cur_win.append(nums[i])
for i in range(len(nums)-k+1):
cur_max = -100000
cur_win.append(nums[i+k-1])
for j in range(k):
if cur_max < cur_win[j]:
cur_max = cur_win[j]
# cur_max = max(cur_win)
result.append(cur_max)
cur_win = cur_win[1:]
return result
解析有点复杂。