这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
从简单题目开始刷,锻炼自己的思维能力,为面试准备~
二、思路分析
-
看看题目的示例,我们来理一理这个思路~
-
示例 1:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。
-
示例2:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2 。
-
示例3:
输入:[2, 2, 3, 1] 输出:1 解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
-
先将数组降序排序
-
再去重
-
判断数组长度是否小于3
-
小于3的话返回最大值,即第一个数
-
反之,返回第三大的数
三、AC 代码
-
降序破解法:
class Solution { public int thirdMax(int[] nums) { //int数组转integer数组 IntStream stream = Arrays.stream(nums); Stream<Integer> integerStream = stream.boxed(); Integer[] integers = integerStream.toArray(Integer[]::new); List<Integer> result = new ArrayList<>(); //降序排序 Arrays.sort(integers, Collections.reverseOrder()); for (int num : integers) { if (!result.contains(num)){ result.add(num); } } if (result.size()<3){ return result.get(0); } return result.get(2); } }
- 个人感觉我这种解法除了转换比较麻烦,思路还是蛮清晰的嘛!
-
巧用TreeSet破解:
class Solution { public int thirdMax(int[] nums) { TreeSet<Integer> set=new TreeSet(); for(int i:nums){ set.add(i); if(set.size()>3){ set.pollFirst(); } } if(set.size()<3){ return set.pollLast(); }else{ return set.pollFirst(); } } }
- 把元素都插入TreeSet里面,他会自动升序排列
- 在插入过程中,一直维护一个长度为3的,如果大于3,那么删除最小的那个
- 插入完毕
- 没有第三个 就返回最后一个(最大值) ,否则返回第一个(一直维护第一个是倒数第三大的)。
四、总结
- 解题思路千千万,不管是本办法还好,还是奇思妙想的解法,能解决就是好办法!白猫黑猫能抓老鼠的猫就是好猫!
- 这里列几个LeetCode的其他大神的解法作为参考!
- 点击跳转:循环解法
- 点击跳转:JAVA 一行
**路漫漫其修远兮,吾必将上下求索~ **如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah