Example 36
第三大的数
题目概述:给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
解题思路:将数组从大到小排序后,从头开始遍历数组,通过判断相邻元素是否不同,来统计不同元素的个数。如果能找到三个不同的元素,就返回第三大的元素,否则返回最大的元素。
示例代码如下:
public class TheThirdLargestNumber { /** * 给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 * 示例 1: * 输入:[3, 2, 1] * 输出:1 * 解释:第三大的数是 1 。 * 示例 2: * 输入:[1, 2] * 输出:2 * 解释:第三大的数不存在, 所以返回最大的数 2 。 * 示例 3: * 输入:[2, 2, 3, 1] * 输出:1 * 解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 * 此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。 * 来源:力扣(LeetCode) * 链接:https://leetcode.cn/problems/third-maximum-number */ public static void main(String[] args) { TheThirdLargestNumber ttln = new TheThirdLargestNumber(); System.out.println(ttln.thirdMax(new int[]{3, 2, 1})); // 1 } /** * 官方 * * @param nums * @return */ public int thirdMax(int[] nums) { Arrays.sort(nums); reverse(nums); for (int i = 1, diff = 1; i < nums.length; ++i) { if (nums[i] != nums[i - 1] && ++diff == 3) { // 此时 nums[i] 就是第三大的数 return nums[i]; } } return nums[0]; } public void reverse(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; left++; right--; } } }