跳到主要内容

2561.重排水果

链接:2561.重排水果
难度:Hard
标签:贪心、数组、哈希表
简介:给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。返回一个整数数组,其中数组的第 i 个元素对应第 i 个查询的答案。

题解 1 - cpp

  • 编辑时间:2023-02-05
  • 执行用时:140ms
  • 内存消耗:83.8MB
  • 编程语言:cpp
  • 解法介绍:先抵消相同数字, 后最小和最大值进行匹配, 同时考虑两个值通过最小值进行一次交换。
class Solution {
public:
long long minCost(vector<int>& basket1, vector<int>& basket2) {
unordered_map<int, int> m;
for (auto &v : basket1) m[v]++;
for (auto &v : basket2) m[v]--;
vector<int> list;
int nmin = 0x3f3f3f3f;
for (auto &item : m) {
if (item.second % 2 != 0) return -1;
nmin = min(nmin, item.first);
for (int i = 0; i < abs(item.second) / 2; i++) list.push_back(item.first);
}
sort(list.begin(), list.end());
long long ans = 0;
for (int i = 0; i < list.size() / 2; i++) ans += min(list[i], nmin * 2);
return ans;
}
};

题解 2 - python

  • 编辑时间:2023-02-05
  • 执行用时:212ms
  • 内存消耗:36.7MB
  • 编程语言:python
  • 解法介绍:同上。
class Solution:
def minCost(self, basket1: List[int], basket2: List[int]) -> int:
m = Counter()
for num1, num2 in zip(basket1, basket2):
m[num1] += 1
m[num2] -= 1
nmin = min(m)
l = []
for k, v in m.items():
if v % 2 != 0:
return -1
for _ in range(abs(v) // 2):
l.append(k)
l.sort()
ans = 0
for i in range(len(l) // 2):
ans += min(l[i], nmin * 2)
return ans

题解 3 - rust

  • 编辑时间:2023-02-05
  • 执行用时:32ms
  • 内存消耗:4.9MB
  • 编程语言:rust
  • 解法介绍:同上。
impl Solution {
pub fn min_cost(basket1: Vec<i32>, basket2: Vec<i32>) -> i64 {
use std::collections::HashMap;
let mut m = HashMap::<i32, i32>::new();
for num in basket1 {
let v = m.entry(num).or_insert(0);
*v += 1;
}
for num in basket2 {
let v = m.entry(num).or_insert(0);
*v -= 1;
}
let mut nmin = i32::MAX;
let mut list = vec![];
for (k, v) in m.iter() {
if *v % 2 != 0 {
return -1;
}
nmin = nmin.min(*k);
for _ in 0..(*v).abs() / 2 {
list.push(*k);
}
}
list.sort();
let mut ans = 0;
for i in 0..list.len() / 2 {
ans += list[i].min(nmin * 2) as i64;
}
ans
}
}