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

贪心+滑窗+递推,LeetCode 2555. 两个线段获得的最多奖品

一、题目

1、题目描述

2、接口描述

python3
 ​
class Solution:
    def maximizeWin(self, prizePositions: List[int], k: int) -> int:
cpp
 ​
class Solution {
public:
    int maximizeWin(vector<int>& prizePositions, int k) {
        int n = prizePositions.size();
        std::vector<int> pre(n);
        int res = 0;
        for (int j = 0, i = 0; j < n; ++ j) {
            while (prizePositions[j] - prizePositions[i] > k) ++ i;
            res = std::max(res, j - i + 1 + pre[i]);
            if (j + 1 < n)
                pre[j + 1] = std::max(pre[j], j - i + 1);
        }
        return res;
    }
};
C#
 ​
public class Solution
{
    public int MaximizeWin(int[] prizePositions, int k)
    {

    }
}

3、原题链接

2555. 两个线段获得的最多奖品


二、解题报告

1、思路分析

考虑最优解的两个线段会相交吗?

不会,我们总能将两个相交线段分开来得到更优解

我们考虑滑窗维护当前线段[i, j],在过程中维护答案 res = max(res, j - i + 1 + pre[i])

pre[i] 指 [0, i) 内的最长线段

pre[] 可以在滑窗 的过程中递推

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

python3
 ​
class Solution:
    def maximizeWin(self, prizePositions: List[int], k: int) -> int:
        n = len(prizePositions)
        pre = [0] * n
        res = i = 0
        for j in range(n):
            while prizePositions[j] - prizePositions[i] > k:
                i += 1
            res = max(res, j - i + 1 + pre[i])
            if j + 1 < n:
                pre[j + 1] = max(pre[j], j - i + 1)
        return res
cpp
 ​
class Solution {
public:
    int maximizeWin(vector<int>& prizePositions, int k) {
        int n = prizePositions.size();
        std::vector<int> pre(n);
        int res = 0;
        for (int j = 0, i = 0; j < n; ++ j) {
            while (prizePositions[j] - prizePositions[i] > k) ++ i;
            res = std::max(res, j - i + 1 + pre[i]);
            if (j + 1 < n)
                pre[j + 1] = std::max(pre[j], j - i + 1);
        }
        return res;
    }
};
C#
 ​
public class Solution
{
    public int MaximizeWin(int[] prizePositions, int k)
    {
        int n = prizePositions.Length;
        int[] pre = new int[n];
        int res = 0;
        for (int j = 0, i = 0; j < n; ++ j)
        {
            while (prizePositions[j] - prizePositions[i] > k)
                ++i;
            res = Math.Max(res, j - i + 1 + pre[i]);
            if (j + 1 < n)
                pre[j + 1] = Math.Max(j - i + 1, pre[j]);
        }
        return res;
    }
}


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

相关文章:

  • ES6 类语法:JavaScript 的现代化面向对象编程
  • MySQL数据库基础
  • 【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测
  • 第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)
  • arm-linux平台、rk3288 SDL移植
  • 全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析
  • adb的安装和使用 以及安装Frida 16.0.10+雷电模拟器
  • QT设置闹钟超时播报
  • B站宋红康JAVA基础视频教程之Chapter13(泛型)
  • Inspector里面可以编辑的变量相关
  • C#使用handle实现获取占用指定文件或文件夹的进程(Locksmith功能)
  • Linux编译器-gcc/g++使用
  • java后端如何发送httpGET和POST请求
  • .NET 一款用于解密web.config配置的工具
  • 11.5.软件系统分析与设计-面向对象的程序设计与实现
  • 【贪心算法】(一)贪心算法理论及基础习题
  • Redis:发布(pub)与订阅(sub)实战
  • HBase 源码阅读(四)HBase 关于LSM Tree的实现- MemStore
  • 视频怎么转换成mp3格式?分享5种便捷的转换方法
  • Ef 在迁移过程中 遇到 The migration ‘xxxx‘ was not found. 的问题(未解决)
  • JAVAEE初阶第七节(下)——物理原理与TCP_IP
  • 代码随想录训练营day44|1143.最长公共子序列,1035.不相交的线, 53. 最大子序和,392.判断子序列
  • TinyWebserver的复现与改进(7):日志系统
  • 25 考研数学大纲有什么变化?
  • 果蔬识别系统性能优化之路(一)
  • 【LeetCode:3174】清除数字(Java)