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

(nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)

题目:2561. 重排水果

在这里插入图片描述

思路:哈希表+贪心,时间复杂度0(nlogn)。

哈希表来记录两个数组中元素的差异情况,如果相差的值不是偶数,那无法相等,返回-1即可。
差值都为偶数,那可以开始交换,用数组a、b来记录两个篮子需要交换的水果。理论上是选这两个篮子组合里最小的一半即可,但没有限制水果的交换次数,此时可能会存在最小的一个水果呢,用于做中间商,交换两个数组中的元素,也就是进行两次。细节看注释。

C++版本:

class Solution {
public:long long minCost(vector<int>& basket1, vector<int>& basket2) {// 哈希表来记录两个数组中元素的差异情况unordered_map<int,int> mp;int n=basket1.size();for(int i=0;i<n;i++){mp[basket1[i]]++;mp[basket2[i]]--;}// 数组a、b来记录两个篮子需要交换的水果vector<int> a,b;// 数组a、b里最小的一个水果int mn=INT_MAX;for(auto x:mp){// 相差的值不是偶数,那无法相等if(x.second%2!=0) return -1;mn=min(mn,x.first);if(x.second>0){for(int i=0;i<x.second/2;i++){a.push_back(x.first);}}else{for(int i=0;i<-1*x.second/2;i++){b.push_back(x.first);}}}//升序sort(a.begin(),a.end());//降序sort(b.begin(),b.end(),greater());long long ans=0;for(int i=0;i<a.size();i++){// 可能会存在最小的一个水果,用于做中间商,交换两个数组中的元素,也就是进行两次ans+=min({a[i],b[i],mn*2});}return ans;}
};

JAVA版本:

class Solution {public long minCost(int[] basket1, int[] basket2) {Map<Integer,Integer> mp=new HashMap<>();int n=basket1.length;for(int i=0;i<n;i++){mp.merge(basket1[i],1,Integer::sum);mp.merge(basket2[i],-1,Integer::sum);}int mn=Integer.MAX_VALUE;List<Integer> a=new ArrayList<>();List<Integer> b=new ArrayList<>();for(Map.Entry<Integer,Integer> e :mp.entrySet()){int x=e.getKey(),y=e.getValue();if(y%2!=0) return -1;mn=Math.min(mn,x);if(y>0){for(int i=0;i<y/2;i++){a.add(x);}}else{for(int i=0;i<-1*y/2;i++){b.add(x);}}}Collections.sort(a);b.sort(Collections.reverseOrder());long ans=0;for(int i=0;i<a.size();i++){ans+=Math.min(mn*2,Math.min(a.get(i),b.get(i)));}return ans;}
}

GO版本:

func minCost(basket1 []int, basket2 []int) int64 {mp:=map[int]int{}for i:=range basket1 {mp[basket1[i]]++mp[basket2[i]]--}a,b:=[]int{},[]int{}mn:=math.MaxIntfor x,y:=range mp {if y%2!=0 {return -1}mn=min(mn,x)if y>0 {for i:=0;i<y/2;i++ {a=append(a,x)}}else{for i:=0;i< -1 * y/2;i++ {b=append(b,x)}}}var ans int64 = 0 slices.Sort(a)slices.SortFunc(b,func(i,j int) int {return j-i })for i:=range a {ans+=int64(min(a[i],b[i],mn*2))}return ans
}
http://www.dtcms.com/a/312033.html

相关文章:

  • UNet改进(29):记忆增强注意力机制在UNet中的创新应用-原理、实现与性能提升
  • 【嵌入式汇编基础】-ARM架构基础(三)
  • 动态规划解最长回文子串:深入解析与优化问题
  • 【redis】基于工业界技术分享的内容总结
  • JS的作用域
  • 第15届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2024年1月28日真题
  • sqli-labs:Less-20关卡详细解析
  • MFC 实现托盘图标菜单图标功能
  • 中州养老Day02:服务管理护理计划模块
  • 中之人模式下的虚拟主持人:动捕设备与面捕技术的协同驱动
  • 2025系规教材改革后,论文怎么写?
  • 错误处理_IncompatibleKeys
  • 在Linux上对固态硬盘进行分区、格式化和挂载的步骤
  • CH32V单片机启用 FPU 速度测试
  • MVVM——ArkUI的UI开发模式
  • 使用Python开发Ditto剪贴板数据导出工具
  • 使用C++实现日志(2)
  • MCP终极指南 - 从原理到实战(基础篇)
  • 面试实战,问题二十二,Java JDK 17 有哪些新特性,怎么回答
  • windows内核研究(软件调试-异常的处理流程)
  • 幂等性介绍和下单接口幂等性保证实现方案
  • 雷卯针对香橙派Orange Pi RV2开发板防雷防静电方案
  • kotlin小记(1)
  • Waterfox水狐浏览器、火狐浏览器外观修改
  • Dice Combinations(Dynamic Programming)
  • 【Bug记录】关于copy的表不能copy主键和index的解决办法
  • python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
  • SM2椭圆曲线密码算法原理与纯C语言实现详解
  • #Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理
  • ARMv8/v9架构FAR_EL3寄存器介绍