当前位置: 首页 > 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);}}
}
http://www.xdnf.cn/news/223777.html

相关文章:

  • 西门子PLC S7-1200 电动机的软启动控制
  • 自定义Tool
  • 【网工第6版】第6章 网络安全③
  • Fiori学习专题二十五:Remote OData Service
  • 基于CATIA参数化球体建模的自动化插件开发实践——NX建模之球体命令的参考与移植
  • Transformer-CVPR2025-线性注意力-Breaking the Low-Rank Dilemma of Linear Attention
  • 【AI】DeepSeek 流程图 / 时序图制作,Word 排版错乱问题,文字转直观图形
  • 机器学习-07-分类评估函数进阶案例
  • 【数学建模国奖速成系列】优秀论文绘图复现代码(四)
  • Access开发:轻松一键将 Access 全库表格导出为 Excel
  • 游戏引擎学习第250天:# 清理DEBUG GUID
  • 栈与队列 Part 7
  • String、StringBuffer、StringBuilder 的区别
  • SpringMVC知识点总结(速查速记)
  • SIFT特征点检测
  • 产品经理.产品设计.产品设计工具
  • 什么是美颜SDK?美颜SDK安卓与iOS端开发指南
  • 【11408学习记录】英语书信通知写作模板大全:5个高分句式+使用场景解析,速存每日一句拆解练习!
  • 组网技术知识点
  • electron+vite+vue3 快速入门教程
  • C++23 std::invoke_r:调用可调用 (Callable) 对象 (P2136R3)
  • Postgresql源码(144)LockRelease常规锁释放流程分析
  • Linux -- SysremV 共享内存通信
  • 环形链表的约瑟夫问题
  • 从生成到上线:飞算JavaAl工程化能力拆解(含K8s部署脚本自动生成)
  • STM32printf重定向到串口含armcc和gcc两种方案
  • 高并发内存池(五):性能测试与性能优化
  • Java实现归并排序算法
  • 《机器学习中的过拟合与模型复杂性:理解与应对策略》
  • 量化交易之数学与统计学基础2.3——线性代数与矩阵运算 | 线性方程组