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

LeetCode LCP40 心算挑战题解

看似一道简单的题目,实则不然,没有看评论的话,实在想不出来怎么写。
现在则由我来转述思想供大家参考理解,还是先给出示例,供大家更好的理解这个题目。

输入:cards = [1,2,8,9], cnt = 3输出:18解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。

假若cards=[2,3,1,5,8,6,9]

所以我们的首要目标是先优化数组,使得数组从小到大排序Arrays.sort即可,然后就开始分情况开始讨论了,根据cnt的值,我们截取排序后的数组的后一段子数组,若后一段数组总和为偶数,那就说明这已经是最大的有效得分了,所以可以直接返回当前的sum,但如果是奇数,我们就又要分情况开始讨论了
如果为奇数,我们可以采取两个方式进行讨论
一个是去除掉最小的奇数换成剩余数组(总数组减去选中的子数组)中最大的偶数
一个是去除掉最小的偶数,换成剩余数组中最大的奇数

这个就是总的思路,其实并不难理解,主要是难在想到,没错就是想到…

class Solution {public int maximumScore(int[] cards, int cnt) {Arrays.sort(cards);int n = cards.length;int[] num = new int[cnt];int sum = 0;int mi1 = Integer.MAX_VALUE;int mi2 = Integer.MAX_VALUE;for(int i=0;i<cnt;i++){num[i] = cards[n-cnt+i];sum+=num[i];if(num[i]%2==0){mi2 = Math.min(mi2,num[i]);}else{mi1 = Math.min(mi1,num[i]);}}int mx1 = Integer.MIN_VALUE;int mx2 = Integer.MIN_VALUE;for(int j=0;j<n-cnt;j++){if(cards[j]%2==0){mx2 = Math.max(mx2,cards[j]);}else{mx1 = Math.max(mx1,cards[j]);}}if(sum%2==0) return sum;else{int option1 = 0, option2 = 0;// 尝试用最大偶数替换当前选中的最小奇数if (mi1 != Integer.MAX_VALUE && mx2 != Integer.MIN_VALUE) {option1 = sum - mi1 + mx2;}// 尝试用最大奇数替换当前选中的最小偶数if (mi2 != Integer.MAX_VALUE && mx1 != Integer.MIN_VALUE) {option2 = sum - mi2 + mx1;}return Math.max(option1, option2);}}
}

相关文章:

  • AI工作流自动化工具coze、dify、n8n,个人用户如何选择?
  • 当插入排序遇上“凌波微步“——希尔排序的奇幻漂流
  • 【DBeaver】如何连接MongoDB
  • Java学习手册:Spring MVC 架构与实现
  • iOS HTTPS 抓包踩坑记:几种方案尝试与替代工具记录
  • 人工智能数学基础(五):概率论
  • Android 移动开发:ProgressBar(转圈进度条)
  • C# 面向对象实例演示
  • 私有知识库 Coco AI 实战(六):打造 ES Mapping 小助手
  • C#学习第20天:垃圾回收
  • winget使用
  • UI设计之photoshop学习笔记
  • linux联接服务器SSH-局域网内网穿透分享
  • 【Java】一篇讲透Java中的集合类
  • Centos 7安装 NVIDIA CUDA Toolkit
  • Java 运算符入门指南
  • Win下的Kafka安装配置
  • 闪电贷攻击方式
  • C++(初阶)(十六)——set
  • 网络规划和设计
  • 经营业绩持续稳中向好,国铁集团2024年度和2025年一季度财务决算公布
  • 马上评|什么才是地方文旅宣传的正确姿势
  • 2024“好评中国”网络评论大赛结果揭晓
  • 巴西外长维埃拉:国际形势日益复杂,金砖国家必须发挥核心作用
  • 复星医药换帅:陈玉卿接棒吴以芳任董事长,吴以芳改任复星国际执行总裁
  • 建行一季度净利833.51亿同比下降3.99%,营收降5.4%