LeetCode.1046-最后的石头重量(Last Stone Weight)
这是小川的第388次更新,第418篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第250题(顺位题号是1046)。有一个石头集合,每个石头都有一个正整数重量值。
每次,我们选择两块最重的岩石并将它们粉碎在一起。假设石头的重量为x和y,x <= y。粉碎的结果是:
如果x == y,两块石头都被完全粉碎;
如果x != y,重量为x的石头被完全粉碎,重量为y的石头具有新的重量y-x。
最后,剩下最多1块石头。返回这块石头的重量(如果没有留下石头,则返回0)。
例如:
输入:[2,7,4,1,8,1]
输出:1
说明:
我们将7和8结合起来得到1,所以数组转换为[2,4,1,1,1],
然后我们将2和4结合起来得到2,所以数组转换为[2,1,1,1],
然后我们将2和1结合起来得到1,所以数组转换为[1,1,1],
然后我们将1和1组合起来得到0,所以数组转换为[1],那就是最后一块石头的重量值。
注意:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
02 第一种解法
根据题目的意思,我们需要干两件事情,第一,每次找到数组中最大的两个数进行值替换,比较大小,相等就全干掉,不相等就把较大的值替换为两者的差值,再把较小的干掉;第二,重复第一步,直到所有元素都被干掉或者最后只剩下一个元素。
思路:先将数组排序,统计其中值为0的元素个数,因为stones[i]
的范围在[1,1000],循环进行值替换(替换为0),直到最后数组中值为0的元素个数等于stones.length
或者stones.length-1
,才结束循环。如果数组最后一个元素不等于0,就返回此元素的值,反之返回0。
public int lastStoneWeight(int[] stones) {
int n = stones.length;
while (!(checkStones(stones) == n || checkStones(stones) == n-1)) {
if (stones[n-2] == stones[n-1]) {
stones[n-2] = 0;
stones[n-1] = 0;
} else {
stones[n-1] -= stones[n-2];
stones[n-2] = 0;
}
}
// 全是0,或者只有最后一个元素不为0
return stones[n-1] == 0 ? 0 : stones[n-1];
}
/**
* 统计数组stones中值为0的元素个数
* @param stones
* @return
*/
public int checkStones(int[] stones) {
Arrays.sort(stones);
int count = 0, n = stones.length;
for (int i=0; i<n; i++) {
if (stones[i] == 0) {
count++;
}
}
return count;
}
03 第二种解法
我们可以将第一种解法再简化下,不去计数的个数,依旧按照题目的规则进行替换0操作,效果一样。
public int lastStoneWeight2(int[] stones) {
int n = stones.length;
for (int i=0; i<n-1; i++) {
Arrays.sort(stones);
if (stones[n-2] == stones[n-1]) {
stones[n-2] = 0;
stones[n-1] = 0;
} else {
stones[n-1] -= stones[n-2];
stones[n-2] = 0;
}
}
// 全是0,或者只有最后一个元素不为0
return stones[n-1] == 0 ? 0 : stones[n-1];
}
04 第三种解法
在第一种解法和第二种解法中,每次循环都需要重新排序数组,能不能将此步骤省掉?
答案是可以的,利用优先队列来实现。
在初始化优先队列时,选择有Comparator
作为参数的构造方法,选择其reverseOrder
方法,倒序排序(从大到小),将数组中的元素入队列,然后开始循环处理。因为优先队列会自动排序,最大值永远在队首,第二大的值次之,将两者取出相减,如果两者之差大于0,就将差值入队列。最后判断队列是否为空,为空就返回0,不为空就返回队首的元素值。
public int lastStoneWeight3(int[] stones) {
PriorityQueue<Integer> pq = new
PriorityQueue<>(Comparator.reverseOrder());
for (int stone : stones) {
pq.offer(stone);
}
while (pq.size() > 1) {
int num = pq.poll() - pq.poll();
if (num > 0) {
pq.offer(num);
}
}
return pq.isEmpty() ? 0 : pq.peek();
}
05 小结
算法专题目前已连续日更超过七个月,算法题文章256+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.1046-最后的石头重量(Last Stone Weight)的更多相关文章
- LeetCode 1046. 最后一块石头的重量(1046. Last Stone Weight) 50
1046. 最后一块石头的重量 1046. Last Stone Weight 题目描述 每日一算法2019/6/22Day 50LeetCode1046. Last Stone Weight Jav ...
- LeetCode 1046. 最后一块石头的重量 (贪心)
有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那 ...
- LeetCode 1046. Last Stone Weight
原题链接在这里:https://leetcode.com/problems/last-stone-weight/ 题目: We have a collection of rocks, each roc ...
- leetcode 57 Insert Interval & leetcode 1046 Last Stone Weight & leetcode 1047 Remove All Adjacent Duplicates in String & leetcode 56 Merge Interval
lc57 Insert Interval 仔细分析题目,发现我们只需要处理那些与插入interval重叠的interval即可,换句话说,那些end早于插入start以及start晚于插入end的in ...
- LeetCode 1049. Last Stone Weight II
原题链接在这里:https://leetcode.com/problems/last-stone-weight-ii/ 题目: We have a collection of rocks, each ...
- 【Leetcode_easy】1046. Last Stone Weight
problem 1046. Last Stone Weight 参考 1. Leetcode_easy_1046. Last Stone Weight; 完
- leetcode_1049. Last Stone Weight II_[DP]
1049. Last Stone Weight II https://leetcode.com/problems/last-stone-weight-ii/ 题意:从一堆石头里任选两个石头s1,s2, ...
- Leetcode--Last Stone Weight II
Last Stone Weight II 欢迎关注H寻梦人公众号 You are given an array of integers stones where stones[i] is the we ...
- leetcode 1049 Last Stone Weight II(最后一块石头的重量 II)
有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那么 ...
随机推荐
- 一个微信小程序跳转到另一个微信小程序
简单来说分两步走: 1.配置项目根目录的 app.json 文件中的 navigateToMiniProgramAppIdList { "pages": [ "pages ...
- Gym - 101173H Hangar Hurdles (kruskal重构树/最小生成树+LCA)
题目大意:给出一个n*n的矩阵,有一些点是障碍,给出Q组询问,每组询问求两点间能通过的最大正方形宽度. 首先需要求出以每个点(i,j)为中心的最大正方形宽度mxl[i][j],可以用二维前缀和+二分或 ...
- requests结合xpath爬取豆瓣最新上映电影
# -*- coding: utf-8 -*- """ 豆瓣最新上映电影爬取 # ul = etree.tostring(ul, encoding="utf-8 ...
- Spring mvc i18n国际化的简单demo
在渲染视图的xml文件中,配置一个i18nBean 实现两个接口: SessionLocaleResolver --> 加载资源主题 ReloadableResourceBundleMessag ...
- ELK——集中式日志系统
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/index.html 基本流程是 Shipper 负责从各种数据源里采集数据,然后 ...
- Python CGI编程Ⅸ
通过CGI程序传递下拉数据. HTML 下拉框代码如下: dropdown.py 脚本代码如下所示: 修改 dropdown.py 权限: CGI中使用Cookie 在 http 协议一个很大的缺点就 ...
- Selenium 日期控件处理
在WEB测试时,我们会碰到需要输入日期的情况,如果输入框能直接输入,那最好不过了.但是很多时候,输入框是不可输入的,必须的点击日期控件才行. 现在就来聊聊对日期控件的两种操作方法,我们以12306网站 ...
- JavaWeb_ XML文件
百度百科 传送门 W3school 传送门 XML语言(可扩展标记语言):是一种表示数据的格式,按照xml规则编写的文本文件称为xml文件 Learn 一.编写XML文件 二.DTD约束 三.sche ...
- java学期总结
第一周https://www.cnblogs.com/sqhe2000/p/11482760.html. 第二周https://www.cnblogs.com/sqhe2000/p/11521023. ...
- DataV数据可视化功能特性
使用DataV制作实时销售数据可视化大屏 (本课程可以帮助数据分析师学习数据可视化大屏的制作,包括制作的方法.设计原则等基础知识,并提供一个微项目,使用数加的DataV基于ABC公司的经营数据,快速构 ...