题目解析: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 - 解释:所有卡牌都需要选择,所以直接将它们的和返回。
- 输入:
解题思路:
方法一:正向思维(暴力法)
最直接的思路就是使用正向思维,从数组的两端开始取卡牌。我们可以从数组的开头拿一些卡牌,剩下的从末尾拿。为了找到能够获得的最大点数,尝试不同的取卡顺序,计算所有可能的组合得分。
正向思维的具体步骤:
- 从开头拿 0 到 k 张卡牌,剩余的从末尾拿。
- 枚举所有可能的组合,计算其点数。
- 选择点数最大的作为结果。
虽然这个方法能解出问题,但时间复杂度是 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张卡牌的最小和,那么总和减去这部分卡牌和,就是我们需要的最大点数。
优化思路:
- 首先计算卡牌的总和
totalSum。 - 使用滑动窗口法,找出大小为
n - k的子数组的最小和。 - 最大点数就是
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. 可获得的最大点数
题目解析:1423. 可获得的最大点数 > Problem: 1423. 可获得的最大点数 题目描述: 你有一个整数数组 cardPoints,表示排成一行的几张卡牌的点数。你每次可以从这排卡牌的 开头或末尾 拿一张卡牌,最终你需要正好拿 k 张卡牌。目…...
【MySQL】数据库的操作
文章目录 一、查看数据库(显示所有的数据库)二、使用数据库二、创建数据库字符集编码(为数据进行编码然后保存)校验(排序)规则(如何对数据进行排序)推荐这样创建数据库: …...
Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存
1、文件所在位置: 2、需要Guava依赖: <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码…...
rsync 数据镜像同步服务笔记
1. rsync概述 定义:rsync是一款数据镜像备份工具,支持快速完全备份和增量备份,支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点: 支持整个目录树和文件系统的更新;可选择性地保留符号链接、文件属性、权限…...
【layui】多文件上传组件实现
插件预览效果: 需要引入layui的脚本文件layui.js和样式文件layui.css html代码: <div class"layui-input-block"><div class"layui-upload-list"><table class"layui-table"><colgroup><col…...
多维最短路
D-最短?路径_牛客小白月赛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.模式定义 不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 2.模式结构 抽象构件角色 :定义一个抽象接口以规范准备接收附加责任的对象。客户端可以方便调用装饰类和被装饰类…...
TiDB 监控组件之 Blackbox_exporter 运行原理
作者: TiDBerHailang 原文来源: https://tidb.net/blog/b269e96f 1. 介绍 本文介绍了 TiDB 集群监控组件Blackbox Exporter监控运行机制和配置方式。Blackbox Exporter是Prometheus官方提供的 Exporter,它能够通过多种协议对网络服务进行…...
Java之网络编程详解
一、Java网络编程的基本概念 Java网络编程是指在Java语言中使用网络协议和API进行网络通信的编程技术。Java网络编程可以实现多种应用场景,包括客户端/服务器通信、网站开发、分布式系统等。 二、Java网络编程的基本原理 网络编程的核心概念包括网络通信协议、So…...
苍穹外卖学习笔记(二十)
文章目录 用户端历史订单模块:查询历史订单OrderControllerOrderServiceOrderServiceImpl 查询订单详情OrderControllerOrderServiceOrderServiceImpl 用户端历史订单模块: 查询历史订单 OrderController /*** 历史订单*/GetMapping("/historyOrd…...
2024 第一次周赛
A: 题目大意 骑士每连续 i 天每天会得到 i 个金币,(i 1, 2, 3 , …),那么展开看每一天可以得到的金币数:1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 ,2个2, 3个3…,那么我…...
【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现
文章目录 引入认识 YAML 格式规范定义脱敏规则格式脱敏逻辑实现读取 YAML 配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后 对数据进行脱敏处理递归生成字段对应的键路径脱敏测试 完整工具类 引入 在项目中遇到一个需求,需要对交易接口返回结果中的指定…...
dbt doc 生成文档命令示例应用
DBT提供了强大的命令行工具,它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档,这就是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博客 注意:Ansible不支持Windows操作系统部署 根据官方说明: Windows Frequently Asked Questions —…...
深入理解 Parquet 文件格式
深入理解 Parquet 文件格式 深入理解 Parquet 文件格式一、引言二、为什么采用 Parquet 格式1. 行式存储的局限性2. 列式存储的优势 三、Parquet 的工作原理1. 文件结构2. 列块和页面3. 编码和压缩 四、具体数据实例1. 数据示例2. 行式存储 vs 列式存储3. 查询性能对比4. 压缩效…...
计算机挑战赛3
老式的计算机只能按照固定次序进行运算,华安大学就有这样一台老式计算机,计算模式为AB#C,和#为输入的运算符(可能是、-或*,运算符优先级与C一致),现给出A,B,C的数值以及和#对应的运算符…...
深度学习:循环神经网络—RNN的原理
传统神经网络存在的问题? 无法训练出具有顺序的数据。模型搭建时没有考虑数据上下之间的关系。 RNN神经网络 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络。在处理序列输入时具有记忆性…...
蓝桥杯刷题--幸运数字
幸运数字 题目: 解析: 我们由题目可以知道,某个进制的哈沙德数就是该数和各个位的和取整为0.然后一个幸运数字就是满足所有进制的哈沙德数之和.然后具体就是分为以下几个步骤 1. 我们先写一个方法,里面主要是用来判断,这个数在该进制下是否是哈沙德数 2. 我们在main方法里面调用…...
Node.js入门——fs、path模块、URL端口号、模块化导入导出、包、npm软件包管理器
Node.js入门 1.介绍 定义:跨平台的JS运行环境,使开发者可以搭建服务器端的JS应用程序作用:使用Node.Js编写服务器端代码Node.js是基于Chrome V8引擎进行封装,Node中没有BOM和DOM 2.fs模块-读写文件 定义:封装了与…...
多元线性回归:机器学习中的经典模型探讨
引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系,帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…...
从零制作LED智能面具:三种方案详解与避坑指南
1. 项目概述:三种不同段位的LED化妆面具制作如果你对闪烁的灯光和可穿戴电子设备着迷,一直想亲手做一个能在派对或演出中吸引眼球的智能面具,但又觉得无从下手,那这个项目就是为你准备的。我花了几个周末的时间,从最简…...
ARM虚拟化中VTCR寄存器详解与地址转换优化
1. VTCR寄存器概述与虚拟化地址转换背景在ARM架构的虚拟化环境中,内存管理单元(MMU)通过两阶段地址转换机制实现虚拟机内存隔离。VTCR(Virtualization Translation Control Register)作为第二阶段地址转换的核心控制寄…...
【ElevenLabs阿拉伯文语音实战指南】:20年AI语音工程师亲授7大本地化陷阱与3步高保真合成法
更多请点击: https://intelliparadigm.com 第一章:阿拉伯语语音合成的独特挑战与ElevenLabs能力边界 阿拉伯语语音合成(TTS)面临多重语言学与技术层面的固有挑战,远超拉丁语系语言的常规处理范畴。其核心难点在于右向…...
Zabbix监控大屏展示中文总乱码?手把手教你替换DejaVuSans为微软雅黑字体
Zabbix监控大屏中文乱码终极解决方案:从字体替换到视觉优化 当你精心配置的Zabbix监控大屏在向管理层汇报时突然出现中文乱码,那种尴尬就像交响乐团演出时小提琴突然走音。作为经历过数十次企业级监控系统部署的资深运维,我深知字体问题远不止…...
植物大战僵尸 (废物版 杂交版 融合版)2026最新版免费下载(看到请立即转存 资源随时失效)pc手机通用
废物版下载链接 杂交版 融合版 《植物大战僵尸》同人模组生态解析:杂交版、融合版与废物版机制及竞品对比 《植物大战僵尸》(Plants vs. Zombies,简称PVZ)作为塔防游戏史上的经典之作,其官方作品的更新迭代虽然逐渐…...
为什么FlicFlac是Windows用户必备的音频格式转换神器?
为什么FlicFlac是Windows用户必备的音频格式转换神器? 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 还在为不同设备间的音频格式不兼容而烦…...
模型逆向攻击(MIA)实战剖析:从原理到攻防演进
1. 模型逆向攻击(MIA)的本质与核心原理 第一次听说模型逆向攻击(Model Inversion Attack)时,我脑海中浮现的是黑客电影里那种对着键盘一通乱敲就能破解系统的场景。但真正深入研究后才发现,MIA更像是一种&q…...
八千多条提示词,装成你的「随身工具箱」
做图、想创意的时候,最烦的不是「不会写」,而是找不到、和不好管,写过的好句子不知道丢哪了。群里转发的、自己试出来的、收藏夹里吃灰的链接——真要用时,往往只记得个大概,翻半天也找不回来。 BoltPrompt 提示词库想…...
基于CircuitPython与GBoard的Android摩斯码输入外设制作指南
1. 项目概述与核心价值如果你对摩斯码感兴趣,或者身边有朋友因为行动不便,使用传统触摸屏键盘输入文字非常困难,那么这个项目可能会给你带来一些全新的思路。我们这次要做的,不是一个复杂的、需要焊接和精密加工的电子项目&#x…...
Android14实战:在Android Studio中配置Pixel6 Pro模拟器与SDK API 34
1. 为什么你需要一个Android14模拟器? 作为一名Android开发者,我深知在真机上测试应用的重要性。但现实情况是,我们不可能拥有所有型号的设备。还记得去年我在开发一个适配多屏幕的应用时,手头只有两台测试机,结果上线…...
