与你交谈系列#2
介绍
今天我们将开始概述用于解决各种算法问题的概念。对某个概念的理解可能会给你一个直觉,从哪个角度开始思考潜在的解决方案。
有不同但没有太多的概念。今天我将把你的注意力集中在滑动窗口概念上。
滑动窗口
滑动窗口的概念比乍一看要复杂一些。我将通过实际例子来证明这一点。现在,请记住,概念性的想法是我们将有一些必须移动的窗口。让我们立即从示例开始吧。
假设您有一个整数数组和预定义的子数组大小。你被要求找到这样一个子数组(又名窗口),其值的总和将是最大的。
array = [1, 2, 3]window_size = 2# conceptuallysubarray_1 = [1, 2] --> sum 3subarray_2 = [2, 3] --> sum 5maximum_sum = 5
嗯,看起来很简单:
(1) 尺寸为 2 的滑动窗
(2) 2 个子数组
(3) 计算每一项的总和(4) 找出它们之间的最大值
def foo(array: list[int], size: int) -> int: maximum = float("-inf") for idx in range(size, len(array)+1): left, right = idx-size, idx window = array[left:right] maximum = max(maximum, sum(window)) return maximum
array = [1, 2, 3, 4]window_size = 3iterations1 2 3 4 5|___| |___| |___|
def foo(array: List[int] = None, size: int = 0) -> int window_start, max_, window_sum_ = 0, float("-inf"), 0 for window_end in range(len(array)): if window_end > size - 1: window_sum_ -= array[window_start] window_start += 1 window_sum_ += array[window_end] max_ = max(max_, window_sum_) return max_assert foo(array=[1, 2, 3, 4], size=3) == 9
- 滑动窗口? -连续子数组第一个关键字,这意味着我们应该照顾窗口,它代表一个连续的子数组。
- 我们知道滑动窗口的大小吗? - 是的,k,我们得到了窗口的大小,它应该是 k 的长度。
- 我们到底应该在滑动窗口内管理/检查什么? - 找出...的平均值
- 滑动窗口? - 再次连续子数组,第一个关键字,这意味着我们应该处理窗口,它代表一个连续子数组。
- 我们知道滑动窗口的大小吗? - 是的,k,我们得到了窗口的大小,它应该是 k 的长度。
- 我们到底应该在滑动窗口内管理/检查什么? - .. 总和 ...
- 滑动窗口? - 再次连续子数组,第一个关键字,这意味着我们应该处理窗口,它代表一个连续子数组。
- 我们知道滑动窗口的大小吗? - 其实不,我们需要弄清楚。
- 我们到底应该在滑动窗口内管理/检查什么? - ...总和是 >= 到 s ...
- 滑动窗口? - 最长的子串,第一个关键字,这意味着我们应该照顾代表子串的窗口。
- 我们知道滑动窗口的大小吗? - 不,我们需要弄清楚。
- 我们到底应该在滑动窗口内管理/检查什么? - ...不同字符的数量...
你可以从任何一棵树开始,但一旦开始你就不能跳过一棵树。您将从每棵树上采摘一种水果,直到您无法采摘为止,也就是说,当您必须从第三种水果中采摘时,您将停止。
编写一个函数来返回两个篮子中水果的最大数量。
- 滑动窗口? - 连续子数组
- 我们知道滑动窗口的大小吗? - 不,我们需要弄清楚。
- 我们到底应该在滑动窗口内管理/检查什么? - ...数字是否不同以及窗口的长度...