class Solution {
public int lastStoneWeight(int[] stones) {
int n=stones.length;
while(n>=2){
Arrays.sort(stones);
stones[n-2]=stones[n-1]-stones[n-2];
n--;
}
return stones[n-1];
}
}
时间0ms,内存37.72mb
第一种递归法思路:
每一轮都来一个排序,最后面两个一定是最大的两个,让他们两个相减相当于粉碎,然后用一个指针n记录位置,没次循环左移一格 相当于最右边的数字已失效
测试用例:stones=[2,7,4,1,8,1]
初始 n=6
第一轮:1 1 2 4 7 8 ->1 1 2 4 1 || 8
n=5
第二轮:1 1 1 2 4 8->1 1 1 2 || 4 8
n=4
第三轮:1 1 1 2 4 8->1 1 1 || 2 4 8
n=3
第四轮:
1 1 1 2 4 8->1 0 II 1 2 4 8
n=2
第五轮:
0 1 1 2 4 8->1 || 1 1 2 4 8
n=1
跳出循环
return[1-1]=1;
第二种优先队列巨简单:(没学过去学)
class Solution {
public int lastStoneWeight(int[] stones) {
PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);
for (int stone : stones) {
pq.add(stone);
}
while (pq.size() > 1) {
int a = pq.poll();
int b = pq.poll();
if (a > b) {
pq.offer(a - b);
}
}
return pq.isEmpty() ? 0 : pq.poll();
}
}