最后一块石头的重量
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 0.0 MB
/*
* 思路:
* 1. 使用Java Stream API和集合框架处理石头的重量。
* 2. 我们可以用List来存储石头,并通过Stream排序。
* 3. 每次从列表中选出最大的两个元素进行处理,然后更新列表。
* 4. 重复操作直到列表中剩下最多一个元素。
* 5. 返回剩余的石头重量或者0。
*/
import java.util.*;
import java.util.stream.Collectors;
public class LastStoneWeightStream {
public int lastStoneWeight(int[] stones) {
List<Integer> stoneList = Arrays.stream(stones).boxed().collect(Collectors.toList());
while (stoneList.size() > 1) {
stoneList = stoneList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
int stone1 = stoneList.remove(0);
int stone2 = stoneList.remove(0);
if (stone1 != stone2) {
stoneList.add(stone1 - stone2);
}
}
return stoneList.isEmpty() ? 0 : stoneList.get(0);
}
}
解释
方法:
该题解采用的是一个简单直观的方法来解决问题。首先,如果石头堆为空或只有一块石头,直接返回对应的结果。否则,进入一个循环,不断排序并取出当前两块最重的石头进行对决。如果两块石头重量相同,则它们都被完全粉碎;如果不同,较小的一块将被完全粉碎,较大的一块的新重量将是二者的差值。这个过程重复,直到石头堆中剩下零块或一块石头。最后返回剩下的石头重量,或者如果没有石头剩下,则返回 0。
时间复杂度:
O(n^2logn)
空间复杂度:
O(1)
代码细节讲解
🦆
在每个循环中进行排序来选择最重的两块石头是否效率最优?存在没有使用排序但效率更高的方法吗?
▷🦆
题解中提到如果两块石头重量不同,较小的石头会被完全粉碎。这种情况下,为什么不考虑较大的石头的重量可能变得不是最大,而是应该重新排序?
▷🦆
在题解的逻辑中,使用了一个不断减少元素数量的列表。这种方式会影响列表的内存管理和性能吗?
▷🦆
题解中将新重量的石头重新添加到列表中然后再次排序,这种操作是否会导致不必要的重复排序?有没有更高效的数据结构来避免这一问题?
▷