
本文共 1092 字,大约阅读时间需要 3 分钟。
贝壳找房2021笔试题解法
今天,我遇到了一个关于贝壳找房2021笔试题的解法,这个题目看起来有点复杂,但我还是尽量理清楚思路。
题目是要求数组a和b中,使得总和sum加上v的和最大的那个v。sum部分是固定的,是当且仅当b[i] = 1时,a[i]加入到sum中,否则不计。因此,sum是不变的,我们需要找到第二部分v的最大值,这样总和才会最大。
接下来,v的计算方式是通过一个滑动窗口的方法。这里的滑动窗口,窗口中的元素是那些b[i] = 0的a[i]。因为只有当b[i] = 0时,才会将a[i]加到窗口的和中。因此,问题转化为在数组a中找到一个长度为m的窗口,使得窗口中所有a[i]之和的最大值尽可能大。
在给定的代码中,我们可以看到以下步骤:
首先输入n和m的值,以及数组a和b的值。
计算初始总和sum,这部分是对b[i] = 1的元素进行求和。
然后通过一个双重循环遍历数组:
- 对于每一个元素,如果b[i] = 0,则将a[i]加到当前窗口的和s中。
- 如果当前索引i已经大于等于m,并且b[i - m] = 0,则将a[i - m]从当前窗口的和s中减去。
- 在每一步,更新v的最大值。
最终,总和sum加上v的值即为答案。
这个滑动窗口的方法,确实能够在O(n)的时间复杂度内解决问题,而且不需要额外的内存。这大概是题目的解法。
不过,我对这个问题还有点困惑:
滑动窗口到底是怎么工作的?视情况而定,当m固定的时候,滑动窗口的长度m是固定的。窗口从左到右滑动,每次加入一个新元素,移除最早的一个元素。
在这个问题中,为什么只减去b[i - m] = 0的情况?是不是所有的b[i] = 0的情况都会被减掉?或者说,我们只减掉那些在窗口开始之外的元素?
总的来说,我觉得这个解法还是比较聪明的,通过对数组b进行判断,只处理那些b[i] = 0的元素,再根据窗口的长度进行求和,确保每个窗口只包含m个元素。这样的话,我们就可以找到最大的v。
不过,我在想,当m超过n的时候会发生什么情况?或者当m比n小的时候会不会有什么问题?或许需要在代码中添加一些条件判断,比如当i - m < 0的时候,直接跳过这个步骤。
同时,我在想,这个解法是否还有其他的优化空间?比如,在处理窗口的时候,有没有办法在不累加所有元素的情况下计算出s的值。
总的来说,我觉得这个解法还是不错的,通过一个简单的滑动窗口,我们就能在线性时间内找到答案。下一次遇到类似的问题,我可以参考这个思路,先计算sum,然后再处理那些b[i] = 0的情况。
希望我能在实践中不断优化这个思路,找到更高效的解决方案。
发表评论
最新留言
关于作者
