当前位置: 首页 > article >正文

【算法思考记录】力扣1423. 可获得的最大点数[Python3, 滑动窗口]


Problem: 1423. 可获得的最大点数
date: “2023-12-03”


问题重述

正难则反,发挥逆向思维,因为最终无法选择的点数是一个连续区间,所以问题可转换成:在一个给定的数组中,我们需要找到移除长度为 n-k 的子数组后,剩余元素的最大总和。这是一个典型的算法问题,其中数据量达到 10^5,要求找到一种高效的解法。

解决思路

初步考虑使用深度优先搜索(DFS)或动态规划,但由于状态定义复杂且效率不高,因此我们转而使用滑动窗口的方法。这种方法不仅简化了问题,还大幅提高了算法的效率。

滑动窗口策略

核心思路是维护一个固定长度为 n-k 的窗口,通过不断移动这个窗口来找出使剩余部分总和最大的子数组。具体步骤如下:

  1. 计算数组的总和。
  2. 初始化窗口大小为 n-k
  3. 使用两个指针 leftright 来标记窗口的左右边界。
  4. 移动 right 指针扩展窗口,直到达到窗口大小。
  5. 更新最大得分,并逐步移动 left 指针来缩小窗口,同时移动 right 指针继续扫描。
  6. 在每次移动窗口时,更新并记录最大得分。

窗口大小为0时的特殊情况处理

此时无需维护任何滑动窗口,因为total就是答案本身,直接返回即可。

Python代码实现

class Solution:
    def maxScore(self, cps: List[int], k: int) -> int:
        ans = 0
        total = sum(cps)
        n = len(cps)
        win_size = n - k
        if win_size == 0:
            return total

        left, right = 0, 0
        sub_arr_sum = 0
        while right < n:
            sub_arr_sum += cps[right]  # 加入窗口
            if (right - left + 1) >= win_size:
                ans = max(ans, total - sub_arr_sum)
                sub_arr_sum -= cps[left]
                left += 1
            right += 1
        
        return ans


http://www.kler.cn/a/155954.html

相关文章:

  • Objection
  • 如何为电子课程创造创意
  • Day09 C++ 存储类
  • 品融电商:新形势下电商平台如何助力品牌长期经营
  • 怎么监控员工电脑?分享5个监控员工电脑的绝佳方法(立竿见影!建议收藏!)
  • 基于表格滚动截屏(表格全部展开,没有滚动条)
  • golang 实现单向链表(lru)、双向链表、双向循环链表
  • Error:cannot launch node of type [map_server/map_server]
  • A++ 敏捷开发-1 如何改善
  • 常微分方程组的数值解法(C++)
  • WPS开发文档
  • Android:BackStackRecord
  • KALI LINUX安全审核
  • 实时设计#N3期训练营DONE,ComfyUI中文社区@上海
  • 再谈项目管理中的效率问题
  • “此应用专为旧版android打造,因此可能无法运行”,问题解决方案
  • 并发编程1:线程的基本概念
  • C# 使用HtmlAgilityPack解析提取HTML内容
  • 爬虫伦理与法律:确保数据采集合法性与伦理性
  • Unity工具脚本-检测资源文件夹是否有预制件是指定层级
  • 深入了解Java8新特性-日期时间API之ZonedDateTime类
  • 【Arduino库之:FastLED库】
  • SCAU:数字字符序列2
  • Linux(13):例行性工作排程
  • 前后端分离部署https
  • qt-C++笔记之组件-分组框QGroupBox