LeetCode 第三大的数414. Third Maximum Number

题目

描述:给定数组中求第三大的数字;若是没有,返回最大的;时间复杂度O(n)java

记得《剑指offer》才看到过这样的求第k大的题目。可是忘记具体怎么作了。只好先本身想了。数组

由于时间复杂度的限制,因此不能用排序,考虑声明3个空间,用于保存前三大的数字。code

错误

三个空间初始化为N[0]

因为考虑不仔细,想着直接把三个空间初始化为N[0],而后从1开始遍历,发现可能直接输出第一个数字,尽管它不是第三大的。排序

因此应该初始化为Integer.MIN_VALUEio

理解错题目

刚开始没有认真理解好题目,“若是没有”也包括像[1,2,1]这样的虽然个数有三个,可是并无第三大的数字。若是按照原来的想法,则输入[1,1,2]会输出-2147483648。而此时应该输出最大值class

解决:经过HashSet去重,获得“真正的个数”遍历

粗心

输入[1,1,2]会输出1(应该是最大值2),尽管前面个数的判断改了,可是只有两个时候返回仍然是(nums[0]>nums[1]?nums[0]:nums[1]);
经过修改,将HashSet又从新保存回数组,再来比较:(newNums[0]>newNums[1]?newNums[0]:newNums[1]);时间

最终代码

public class Solution {
    public int thirdMax(int[] nums) {
        HashSet<Integer> integers=new HashSet<>();
        for (Integer integer : nums) {
            integers.add(integer);
        }
        int[] newNums=new int[integers.size()];
        int  i=0;
        for (Integer integer : integers) {
            newNums[i]=integer;
            i++;
        }
        if(integers.size()==1)
            return newNums[0];
        else if (integers.size()==2) {
            return (newNums[0]>newNums[1]?newNums[0]:newNums[1]);
        }else {
            //声明一个大小为3的数组,保留原数组的最大的三个,并且维护从小到大的排序
            int first=Integer.MIN_VALUE,second=Integer.MIN_VALUE,third=Integer.MIN_VALUE;
            for (i = 0; i < newNums.length; i++) {
                int curInt = newNums[i];
                if(first<curInt&&second>curInt){
                    first=curInt;
                }else if (curInt>second&&curInt<third) {
                    first=second;
                    second=curInt;
                }else if (curInt>third) {
                    first=second;
                    second=third;
                    third=curInt;
                }
            }
            return first;
        }
    }
}

结果分析

最后只战胜了20%+的java,估计仍是前面HashSet去重可能用的时间有点多了。回头再想一个好一点的去重的办法!co

相关文章
相关标签/搜索