博客
关于我
Leetcode每日随机2021/4/26
阅读量:338 次
发布时间:2019-03-04

本文共 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;}

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

转载地址:http://sfee.baihongyu.com/

你可能感兴趣的文章
C指针之函数指针与typedef
查看>>
CentOS8 字体大小调整
查看>>
设计模式之组合模式
查看>>
设计模式之外观模式
查看>>
Linux 验证、数字证书、RPM包中文件的提取
查看>>
《Redis开发与运维》阅读笔记:键管理之单个键管理
查看>>
(CMake):指定标准进行编译、CMake官方文档查看
查看>>
(恋上数据结构笔记):优先级队列(Priority Queue)
查看>>
(Python学习笔记):条件语句
查看>>
(Python学习笔记):字典
查看>>
(C++11/14/17学习笔记):并发基本概念及实现,进程、线程基本概念
查看>>
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
查看>>
(C++11/14/17学习笔记):创建多个线程、数据共享问题分析及案例
查看>>
(QT学习笔记):按钮组中的常用控件
查看>>
(音视频学习笔记):SDL-YUV显示-播放音频PCM
查看>>
leetcode 14 最长公共前缀
查看>>
做做Java
查看>>
攻防世界新手区pwn
查看>>
2020-2021新技术讲座课程
查看>>
GIT简介
查看>>