最大的和
发布日期:2021-05-14 17:04:22 浏览次数:11 分类:精选文章

本文共 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的情况。

    希望我能在实践中不断优化这个思路,找到更高效的解决方案。

    上一篇:python-class
    下一篇:Python类巩固

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月15日 18时52分30秒