博客
关于我
Leetcode每日随机2021/4/26
阅读量:339 次
发布时间: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/

你可能感兴趣的文章
用正则表达式过滤多余空格
查看>>
XML:采用XHTML和CSS设计可重用可换肤的WEB站点
查看>>
U盘“无法识别的USB设备”解决办法
查看>>
4-6 在Vue中使用插槽
查看>>
十二、 PHP (PDO)操作数据库
查看>>
二叉树 简单实现 问题解决
查看>>
第2章 可行性研究
查看>>
python入门——运算符
查看>>
less简介、less安装、编译、less语法之变量、嵌套、类混入、函数混入、运算、less文件导入
查看>>
【springmvc】传值的几种方式&&postman接口测试
查看>>
泳道图简介
查看>>
Tomcat6中web项目部署路径webapps和wtpwebapps的区别
查看>>
Java判断字符串是否为金额
查看>>
CodeCombat代码全记录(Python学习利器)--安息之云山峰(第四章)代码9
查看>>
nginx配置文件nginx.conf详细讲解(2)
查看>>
nginx配置文件nginx.conf详细讲解(4)--终结篇
查看>>
某公司运维岗位笔试题8
查看>>
一个简单的shell脚本:weblogic日志按天生成(日志压缩)
查看>>
skyfans之每天一个Liunx命令系列之二:uptime
查看>>
js中的文档碎片的理解与使用
查看>>