Leetcode 第137 场周赛。小试了前两题,真的不难。
第三题开始有些难。今天就先写一二题。
1046. 最后一块石头的重量 显示英文描述
题目难度 Easy
有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
看到这题,我懵了以下。。以为有什么巧妙的算法可以解,但是,可以直接跟着题意模拟啊,
好吧,可以每一次排序一下,然后删掉一项,用后来得到的那一项去代替倒数第二项,然后排序。每一次循环都排一下,然后我就想到了用一个数据结构,最大堆。。十分方便,每一次都会自动弹出最大值,我觉得很可以。
下面是AC代码
class Solution {
public int lastStoneWeight(int[] stones) {
int n = stones.length;
PriorityQueue<Integer> ans = new PriorityQueue<Integer>(n, new Comparator<Integer>(){
public int compare(Integer x, Integer y){
return y - x;
}
});
for(int i = 0; i < n; i ++) {
ans.add(stones[i]);
}
while(ans.size() > 1) {
int i = ans.poll();
int j = ans.poll();
int t = i - j;
if(t == 0) continue;
ans.offer(t);
}
if(ans.size() == 0)
return 0;
return ans.poll();
}
}
很快ac完看第二题。
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
一开始看到重复项脑子一热就用了双指针,,后来才发现和以前做过的去重复项数组不一样,再想一想用栈就可以了。
如果下一项不重复,就入栈,如果下一项重复,则下一项不放入栈且弹出那一项。这样有效解决了示例这种情况,即不需要回头判断删除后的数组前面存不存在重复了。
上ac代码。
class Solution {
public String removeDuplicates(String S) {
Stack<Character> stack = new Stack<>();
for(int i = 0; i < S.length(); i ++) {
if (!stack.empty()) {
if(stack.peek() == S.charAt(i))
stack.pop();
else
stack.push(S.charAt(i));
}
else
stack.push(S.charAt(i));
}
char[] a = new char[stack.size()];
for(int i = stack.size() - 1; i >= 0; i --) {
a[i] = stack.pop();
}
return new String(a);
}
}