Leetcode每日随机2021/4/26
发布日期:2021-05-07 13:49:59 浏览次数:11 分类:精选文章

本文共 1555 字,大约阅读时间需要 5 分钟。

题目:

在解决这个问题时,我首先想到的是如何通过最优的方式来最大化数组中元素的和。面对这个问题,我决定采用小根堆(最小堆)的方法来实现。

思路:

对于第一个问题,我使用了一个优先队列(最小堆)来解决。每次取出最小的元素,并将其从总和中减去,同时将其值变为正数并重新插入队列中。这种方法确保了每次操作都能最大化总和的增长。通过这种方式,我能够在K次操作后得到最优解。

对于第二个问题,我最初尝试用贪心算法来解决,但后来发现这种方法并不适用于所有情况。因此,我转而使用了深度优先搜索(DFS)结合暴力搜索的方法,虽然这种方法的时间复杂度较高,但由于数据量较小,最终仍能满足要求。

代码:

代码如下:

public int largestSumAfterKNegations(int[] A, int K) {    PriorityQueue
queue = new PriorityQueue<>(); int sum = 0; for (int a : A) { sum += a; queue.offer(a); } for (int i = 0; i < K; i++) { int head = queue.poll(); sum -= 2 * head; queue.offer(-head); } return sum;}
public boolean canDistribute(int[] nums, int[] quantity) {    Map
map = new HashMap<>(); for (int num : nums) { map.put(num, map.getOrDefault(num, 0) + 1); } List
count = new ArrayList<>(map.values()); Arrays.sort(quantity); return dfs(count, quantity, quantity.length - 1);}private boolean dfs(List
count, int[] quantity, int idx) { if (idx < 0) { return true; } int max = 0; for (int i : count) { max = i > max ? i : max; } if (quantity[idx] > max) { return false; } for (int i = 0; i < count.size(); i++) { if (count.get(i) < quantity[idx]) { continue; } count.set(i, count.get(i) - quantity[idx]); if (dfs(count, quantity, idx - 1)) { return true; } count.set(i, count.get(i) + quantity[idx]); } return false;}

通过以上方法,我成功地解决了这两个问题,并得到了满意的结果。

上一篇:Leetcode每日随机2021/4/27
下一篇:Leetcode每日随机2021/4/25

发表评论

最新留言

很好
[***.229.124.182]2025年03月26日 11时37分41秒