leetcode[Third Maximum Number]

来源:互联网 发布:java中方法的返回值 编辑:程序博客网 时间:2024/05/22 03:18

解法一:

public class Solution {    public int thirdMax(int[] nums) {        //因为大小相同时不分先后,所以先去除重复元素,既然用了set干脆直接用TreeSet排序    TreeSet<Integer> set = new TreeSet<>();    for(int i = 0; i < nums.length; i++){    set.add(nums[i]);    }        if(set.size() < 3){    return set.last();    }    else{    set.remove(set.last());    set.remove(set.last());    return set.last();    }    }}

解法二:

public class Solution {    public int thirdMax(int[] nums) {    //既然只是找第三大的元素,就不用将整个数组进行排序        //使用Integer可以通过判断是否为null来判断这个元素是否被更新过    Integer max1 = null, max2 = null, max3 = null;    for(Integer n : nums){//都用Integer来统一    if(n.equals(max1) || n.equals(max2) || n.equals(max3)){    continue;//之前重复了的元素不处理    }        if(max1 == null || n > max1){//这两种情况都可以对max1进行更新    /*max1 = n;//更新最大值    //相应的,第二大、第三大也要更新    max2 = max1;    max3 = max2;*/        //更新的顺序有影响,上面那个顺序不对    max3 = max2;    max2 = max1;    max1 = n;    }    else if(max2 == null || n > max2){    max3 = max2;    max2 = n;    }    else if(max3 == null || n > max3){    max3 = n;    }    }        if(max3 == null)    return max1;    else    return max3;    }}

解法三:

public class Solution {    public int thirdMax(int[] nums) {    //既然只是找第三大的元素,就不用将整个数组进行排序    /*       优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。 PriorityQueue是从JDK1.5开始提供的新的数据结构接口。  如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列。*/        //使用优先队列来保存数组中最大的三个元素,用set来保证元素不重复    PriorityQueue<Integer> pq = new PriorityQueue<>();    HashSet<Integer> set = new HashSet<>();        for(int val : nums){    if(!set.contains(val)){//重复元素不要    pq.add(val);    set.add(val);    if(pq.size() > 3){    set.remove(pq.poll());//移除队首元素,集合中的元素也移出,加进去就加进去,优先队列自己会排序比较大小    }    }    }        if(pq.size() < 3){    while(pq.size() > 1){    pq.poll();//为了返回最大的元素    }    }        return pq.peek();//此时队首元素要么是第三大的元素,要么是最大的元素(因为上面那四行移走了一些元素)    }}

利用TreeSet对解法三的改进(TreeSet综合了优先队列与普通Set):

public class Solution {    public int thirdMax(int[] nums) {    //既然只是找第三大的元素,就不用将整个数组进行排序        //采用TreeSet来保存最大的三个元素,不断更新        TreeSet<Integer> set = new TreeSet<>();    for(int val : nums){    if(set.contains(val))    continue;    else{    set.add(val);//加进去就行,TreeSet自己会排序,后面大小超出3再移出最小的元素    if(set.size() > 3){    set.pollFirst();//移出集合的第一个元素,也就是最小的元素    }    }    }        if(set.size() < 3){    while(set.size() > 1){    set.pollFirst();    }    }        return set.first();    }}

原创粉丝点击