1046.最后一块石头的重量。2星

以下都是学习别人题解的代码。
方法一:使用排序的方法,速度较快,内存较多
链接:https://www.zhangjc.site/archives-284/

import java.util.Arrays;
public class LastStoneW {
    public int lastStoneWeight(int[] stones) {
        int weight = 0;
        for(int i = 0;i<stones.length-1;i++){
            Arrays.sort(stones);
            weight=stones[stones.length-1]-stones[stones.length-2];
            stones[stones.length-2]=0;
            stones[stones.length-1]=weight;
        }
        return stones[stones.length-1];
    }
}

Arrays.sort,默认升序排序。
个人理解就是,首先对数组进行排序,每次消去最后面的两个数,即为消去最大的数,将消去后两个数原本的位置一个置0,一个置为差值,循环数组长度减1次后得出结果。
方法二:
关键点在于每次都能拿到最重的,并且执行过程中可能产生新的较轻的石头。 因此采用优先队列完成(大顶堆)

链接:https://leetcode-cn.com/problems/last-stone-weight/solution/zhi-xing-yong-shi-1-ms-zai-suo-you-java-ti-jiao-zh/

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

public class LastStoneW {
    public int lastStoneWeight(int[] stones) {
        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {//自定义比较器,降序排列,不用比较器,默认升序排列
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        for(int i = 0;i<stones.length;i++){
            queue.offer(stones[i]);
        }
        while(queue.size() > 1){
            int x = queue.poll();
            int y = queue.poll();
            int diff = Math.abs(x-y);
            if(diff != 0){
                queue.offer(diff);
            }
        }
        if(queue.isEmpty()) return 0;
        return queue.peek();
    }
}

个人理解:使用优先队列,通过比较器将排序方式改为降序。元素依次入队列,每次出队首两个元素来求其差值,因为本身是排序好的所有以不用像上面代码那样求绝对值,直接将差入队即可,当剩余一个元素时得到结果。
//Comparator
实现comparable就是让自身具有比较性,Comparator是比较器。多用来排序和分组。
排序时,两个对象比较的结果有三种:大于,等于,小于。
分组时,两个对象比较的结果只有两种:等于(两个对象属于同一组),不等于(两个对象属于不同组)。
详情见:https://blog.csdn.net/u012250875/article/details/55126531。
//队列
poll,peek,element的
共同点: 都是返回队列中的首个元素
不同点:
poll:将首个元素从队列中弹出,如果队列是空的,就返回null 。
peek:查看首个元素,不会移除首个元素,如果队列是空的就返回null。
element:查看首个元素,不会移除首个元素,如果队列是空的就抛出异常NoSuchElementException。

优先队列!详情见:https://www.cnblogs.com/wei-jing/p/10806236.html,很棒的博客!
Comparator cmp = new Comparator() {
public int compare(Object o1, Object o2) {
//升序
return o1-o2;
//降序
return o2-o1;
} };

发布了18 篇原创文章 · 获赞 0 · 访问量 325

猜你喜欢

转载自blog.csdn.net/qq_44787671/article/details/104734303