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

题目解析:1423. 可获得的最大点数

题目解析:1423. 可获得的最大点数

> Problem: 1423. 可获得的最大点数

题目描述:

你有一个整数数组 cardPoints,表示排成一行的几张卡牌的点数。你每次可以从这排卡牌的 开头或末尾 拿一张卡牌,最终你需要正好拿 k 张卡牌。目标是计算你能够拿到的 最大点数

示例:
  • 示例 1

    • 输入:cardPoints = [1, 2, 3, 4, 5, 6, 1], k = 3
    • 输出:12
    • 解释:最优选择是从右侧拿三张卡牌,点数为 1 + 6 + 5 = 12
  • 示例 2

    • 输入:cardPoints = [2, 2, 2], k = 2
    • 输出:4
    • 解释:不管选择哪两张牌,总是 2 + 2 = 4
  • 示例 3

    • 输入:cardPoints = [9, 7, 7, 9, 7, 7, 9], k = 7
    • 输出:55
    • 解释:所有卡牌都需要选择,所以直接将它们的和返回。

解题思路:

方法一:正向思维(暴力法)

最直接的思路就是使用正向思维,从数组的两端开始取卡牌。我们可以从数组的开头拿一些卡牌,剩下的从末尾拿。为了找到能够获得的最大点数,尝试不同的取卡顺序,计算所有可能的组合得分。

正向思维的具体步骤:
  1. 从开头拿 0 到 k 张卡牌,剩余的从末尾拿。
  2. 枚举所有可能的组合,计算其点数。
  3. 选择点数最大的作为结果。

虽然这个方法能解出问题,但时间复杂度是 O(k),对于较大的 k 值,计算速度会变慢。

代码实现:
class Solution {
public:int maxScore(vector<int>& cardPoints, int k) {int n = cardPoints.size();int leftSum = 0, rightSum = 0;// 先计算最左侧k张牌的总和for (int i = 0; i < k; ++i) {leftSum += cardPoints[i];}int maxPoints = leftSum;// 逐步将左侧的卡牌移到右侧,同时更新最大得分for (int i = 0; i < k; ++i) {leftSum -= cardPoints[k - 1 - i];  // 从左侧减少一张卡牌rightSum += cardPoints[n - 1 - i]; // 从右侧增加一张卡牌maxPoints = max(maxPoints, leftSum + rightSum);}return maxPoints;}
};
复杂度分析:
  • 时间复杂度O(k)。我们需要遍历 k 次来计算所有可能的得分。
  • 空间复杂度O(1)。只使用了常量级别的额外空间。

方法二:滑动窗口优化(逆向思维)

上面的正向思维方法虽然能够解决问题,但效率相对较低。我们可以通过逆向思维使用滑动窗口优化。

关键点:
  • 我们可以将问题转化为滑动窗口问题,通过取出未选择的卡牌部分来最大化剩余部分的和
  • 具体来说,卡牌的总数为 n,我们选择的卡牌总数为 k,则有 n - k 张卡牌是不被选择的。如果能找到不被选择的 n - k 张卡牌的最小和,那么总和减去这部分卡牌和,就是我们需要的最大点数。
优化思路:
  1. 首先计算卡牌的总和 totalSum
  2. 使用滑动窗口法,找出大小为 n - k 的子数组的最小和。
  3. 最大点数就是 totalSum - minWindowSum

通过这个方法,问题的复杂度从暴力解法的 O(2^k) 优化为 O(n),大大提升了效率。


代码实现:

class Solution {
public:int maxScore(vector<int>& cardPoints, int k) {int n = cardPoints.size();// 如果k等于数组长度,直接返回整个数组的和if (k == n) {return accumulate(cardPoints.begin(), cardPoints.end(), 0);}// 计算总点数int totalPoints = accumulate(cardPoints.begin(), cardPoints.end(), 0);// 滑动窗口的长度为n - k,找到最小的窗口和int windowSize = n - k;int currentWindowSum = accumulate(cardPoints.begin(), cardPoints.begin() + windowSize, 0);int minWindowSum = currentWindowSum;// 使用滑动窗口计算最小的窗口和for (int i = windowSize; i < n; ++i) {currentWindowSum += cardPoints[i] - cardPoints[i - windowSize];minWindowSum = min(minWindowSum, currentWindowSum);}// 最大点数为总点数减去最小的窗口和return totalPoints - minWindowSum;}
};

复杂度分析:

  • 时间复杂度O(n),我们只需遍历数组两次,一次用于计算总和,一次用于计算最小滑动窗口和。
  • 空间复杂度O(1),除了存储几个辅助变量外,代码不需要额外的空间。

相关文章:

题目解析:1423. 可获得的最大点数

题目解析&#xff1a;1423. 可获得的最大点数 > Problem: 1423. 可获得的最大点数 题目描述&#xff1a; 你有一个整数数组 cardPoints&#xff0c;表示排成一行的几张卡牌的点数。你每次可以从这排卡牌的 开头或末尾 拿一张卡牌&#xff0c;最终你需要正好拿 k 张卡牌。目…...

【MySQL】数据库的操作

文章目录 一、查看数据库&#xff08;显示所有的数据库&#xff09;二、使用数据库二、创建数据库字符集编码&#xff08;为数据进行编码然后保存&#xff09;校验&#xff08;排序&#xff09;规则&#xff08;如何对数据进行排序&#xff09;推荐这样创建数据库&#xff1a; …...

Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存

1、文件所在位置&#xff1a; 2、需要Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码&#xf…...

rsync 数据镜像同步服务笔记

1. rsync概述 定义&#xff1a;rsync是一款数据镜像备份工具&#xff0c;支持快速完全备份和增量备份&#xff0c;支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点&#xff1a; 支持整个目录树和文件系统的更新&#xff1b;可选择性地保留符号链接、文件属性、权限…...

【layui】多文件上传组件实现

插件预览效果&#xff1a; 需要引入layui的脚本文件layui.js和样式文件layui.css html代码&#xff1a; <div class"layui-input-block"><div class"layui-upload-list"><table class"layui-table"><colgroup><col…...

多维最短路

D-最短&#xff1f;路径_牛客小白月赛102 (nowcoder.com) #include <bits/stdc.h> #define int long long using namespace std; const int N1e6; struct node {int x;int y;int z;bool operator>(const node& other) const {return x> other.x;} }; signed m…...

设计模式03-装饰模式(Java)

4.4 装饰模式 1.模式定义 不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。 2.模式结构 抽象构件角色 &#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。客户端可以方便调用装饰类和被装饰类…...

TiDB 监控组件之 Blackbox_exporter 运行原理

作者&#xff1a; TiDBerHailang 原文来源&#xff1a; https://tidb.net/blog/b269e96f 1. 介绍 本文介绍了 TiDB 集群监控组件Blackbox Exporter监控运行机制和配置方式。Blackbox Exporter是Prometheus官方提供的 Exporter&#xff0c;它能够通过多种协议对网络服务进行…...

Java之网络编程详解

一、Java网络编程的基本概念 Java网络编程是指在Java语言中使用网络协议和API进行网络通信的编程技术。Java网络编程可以实现多种应用场景&#xff0c;包括客户端/服务器通信、网站开发、分布式系统等。 二、Java网络编程的基本原理 网络编程的核心概念包括网络通信协议、So…...

苍穹外卖学习笔记(二十)

文章目录 用户端历史订单模块&#xff1a;查询历史订单OrderControllerOrderServiceOrderServiceImpl 查询订单详情OrderControllerOrderServiceOrderServiceImpl 用户端历史订单模块&#xff1a; 查询历史订单 OrderController /*** 历史订单*/GetMapping("/historyOrd…...

2024 第一次周赛

A: 题目大意 骑士每连续 i 天每天会得到 i 个金币&#xff0c;&#xff08;i 1&#xff0c; 2&#xff0c; 3 &#xff0c; …&#xff09;,那么展开看每一天可以得到的金币数&#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 &#xff0c;2个2, 3个3…,那么我…...

【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现

文章目录 引入认识 YAML 格式规范定义脱敏规则格式脱敏逻辑实现读取 YAML 配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后 对数据进行脱敏处理递归生成字段对应的键路径脱敏测试 完整工具类 引入 在项目中遇到一个需求&#xff0c;需要对交易接口返回结果中的指定…...

dbt doc 生成文档命令示例应用

DBT提供了强大的命令行工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档&#xff0c;这就是dbt docs命令发挥作用的地方。本教程将指导您完成使用dbt生成和提供项目文档的过程。 dbt doc 命令 dbt docs命令有…...

【Windows】【DevOps】Windows Server 2022 安装ansible,基于powershell实现远程自动化运维部署 入门到放弃!

目标服务器安装openssh server参考 【Windows】【DevOps】Windows Server 2022 在线/离线 安装openssh实现ssh远程登陆powershell、scp文件拷贝-CSDN博客 注意&#xff1a;Ansible不支持Windows操作系统部署 根据官方说明&#xff1a; Windows Frequently Asked Questions —…...

深入理解 Parquet 文件格式

深入理解 Parquet 文件格式 深入理解 Parquet 文件格式一、引言二、为什么采用 Parquet 格式1. 行式存储的局限性2. 列式存储的优势 三、Parquet 的工作原理1. 文件结构2. 列块和页面3. 编码和压缩 四、具体数据实例1. 数据示例2. 行式存储 vs 列式存储3. 查询性能对比4. 压缩效…...

计算机挑战赛3

老式的计算机只能按照固定次序进行运算&#xff0c;华安大学就有这样一台老式计算机&#xff0c;计算模式为AB#C&#xff0c;和#为输入的运算符(可能是、-或*&#xff0c;运算符优先级与C一致)&#xff0c;现给出A&#xff0c;B&#xff0c;C的数值以及和#对应的运算符&#xf…...

深度学习:循环神经网络—RNN的原理

传统神经网络存在的问题&#xff1f; 无法训练出具有顺序的数据。模型搭建时没有考虑数据上下之间的关系。 RNN神经网络 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络。在处理序列输入时具有记忆性…...

蓝桥杯刷题--幸运数字

幸运数字 题目: 解析: 我们由题目可以知道,某个进制的哈沙德数就是该数和各个位的和取整为0.然后一个幸运数字就是满足所有进制的哈沙德数之和.然后具体就是分为以下几个步骤 1. 我们先写一个方法,里面主要是用来判断,这个数在该进制下是否是哈沙德数 2. 我们在main方法里面调用…...

Node.js入门——fs、path模块、URL端口号、模块化导入导出、包、npm软件包管理器

Node.js入门 1.介绍 定义&#xff1a;跨平台的JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序作用&#xff1a;使用Node.Js编写服务器端代码Node.js是基于Chrome V8引擎进行封装&#xff0c;Node中没有BOM和DOM 2.fs模块-读写文件 定义&#xff1a;封装了与…...

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系&#xff0c;帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…...

机器人避障轨迹优化实战:用Python+Scipy从数学推导到完整代码实现

机器人避障轨迹优化实战&#xff1a;PythonScipy从数学建模到工程实现 当你在机器人实验室里第一次看到机械臂撞翻咖啡杯&#xff0c;或是无人机在演示中撞上窗帘时&#xff0c;就会明白轨迹优化不仅仅是数学公式——它是让机器人安全高效工作的核心技术。本文将带你从零开始&a…...

3大核心优势!Steamless开源工具链实现高效游戏文件DRM移除

3大核心优势&#xff01;Steamless开源工具链实现高效游戏文件DRM移除 【免费下载链接】Steamless Steamless is a DRM remover of the SteamStub variants. The goal of Steamless is to make a single solution for unpacking all Steam DRM-packed files. Steamless aims to…...

pmap命令隐藏玩法:用-XX参数挖出Linux进程的所有内存秘密

pmap命令隐藏玩法&#xff1a;用-XX参数挖出Linux进程的所有内存秘密 当系统性能出现瓶颈时&#xff0c;开发者和运维工程师往往需要深入分析进程的内存使用情况。虽然常见的pmap -x命令能提供基本的内存映射信息&#xff0c;但真正的高手都知道&#xff0c;-XX选项才是揭开内…...

StabilityGuide故障排查终极指南:从OutOfMemoryError到StackOverFlowError的完整解决方案

StabilityGuide故障排查终极指南&#xff1a;从OutOfMemoryError到StackOverFlowError的完整解决方案 【免费下载链接】StabilityGuide 项目地址: https://gitcode.com/gh_mirrors/st/StabilityGuide StabilityGuide是阿里巴巴开源的系统稳定性知识库&#xff0c;专注于…...

TwinCAT3进阶指南:台达A2伺服扭矩读取与回零实战

1. TwinCAT3与台达A2伺服的基础配置 在开始扭矩读取和回零操作之前&#xff0c;我们需要先完成TwinCAT3与台达A2伺服的基础配置。这部分工作看似简单&#xff0c;但却是后续所有高级功能的基础。我遇到过不少开发者因为基础配置没做好&#xff0c;导致后面各种奇怪的问题。 首先…...

从权重计分到算杀引擎:五子棋AI核心算法实战解析

1. 五子棋AI的算法演进&#xff1a;从基础评分到算杀引擎 五子棋作为一款经典策略游戏&#xff0c;其AI算法的核心在于如何评估棋盘局势并做出最优决策。早期AI主要依赖简单的评分机制&#xff0c;比如给不同的棋形&#xff08;活二、活三、冲四等&#xff09;赋予固定分值&…...

Unity 2021/2019 项目里用 NModbus4.dll 搞定 Modbus TCP 通信(附测试工具和避坑指南)

Unity工业通信实战&#xff1a;用NModbus4实现Modbus TCP全流程开发指南 当游戏引擎遇上工业协议&#xff0c;会碰撞出怎样的火花&#xff1f;三年前接手一个智能制造培训项目时&#xff0c;我首次尝试在Unity中集成Modbus通信。原以为简单的协议对接&#xff0c;却因线程冲突导…...

COMSOL声子晶体复能带模型与PDE模块:声学黑洞复能带模型及实虚能带绘制与二维结构分析

comsol声子晶体复能带模型 PDE模块 声学黑洞 复能带模型 实能带与虚能带的绘制 参考论文 前两个是论文图&#xff0c;后四个是模型及结果图。 可根据模型设置&#xff0c;进行其他二维结构的分析复能带这玩意儿搞声子晶体的肯定不陌生&#xff0c;但用COMSOL PDE模块手搓模型…...

ESP32-IDF开发实战:内置JTAG与OpenOCD高效调试指南

1. 为什么选择ESP32内置JTAG调试&#xff1f; 第一次接触ESP32开发时&#xff0c;你可能会有疑问&#xff1a;市面上这么多调试工具&#xff0c;为什么非要折腾内置JTAG&#xff1f;我刚开始用串口打印调试信息&#xff0c;后来发现这种方法在排查复杂逻辑时效率太低。直到尝试…...

高等数学实战解析:定积分换元法与分部积分法的核心技巧

1. 定积分换元法的实战技巧 第一次接触定积分换元法时&#xff0c;我完全被那些符号变换绕晕了。直到后来在物理实验中遇到一个弹簧振子的能量计算问题&#xff0c;才真正明白这个方法的精妙之处。想象你手里拿着一根橡皮筋&#xff0c;想要测量拉伸它需要的总能量——这就是定…...