题目描述:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例:
示例 1:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。
示例 2:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1] 输出:1 解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
解题思路:
1.首先将没有任何顺序的数组升序排列,通过Arrays.sort(nums);
2.写一个方法,作用是将升序排列的数组变成降序排列
3.方法实现思路:只需要通过可以说是动态指针right、left分别指向数组的首尾元素的位置,交换这两个元素,然后左指针+1,有指针-1,并且前提条件是左指针<右指针
4.得到降序排列的数组之后,在逐个开始遍历数组,什么样的条件是第三大的数呢?我们用diff作为计数器来表示我们在找到第三大的数。第三大的数和它的前一个数一定不相等才行,这样我们就得到了if条件的判断语句。
Java代码实现:
class Solution {
public int thirdMax(int[] nums) {
Arrays.sort(nums);
reverseSort(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 reverseSort(int[] nums){
int left=0;
int right=nums.length-1;
while(left<right){
int temp=nums[right];
nums[right]=nums[left];
nums[left]=temp;
left++;
right--;
}
}
}
JavaScript代码实现:
/**
* @param {number[]} nums
* @return {number}
*/
var thirdMax = function(nums) {
nums.sort();
reverse(nums);
var diff=1;
for (var i=1;i<nums.length;i++){
if(nums[i]!=nums[i-1]&&++diff==3){
return nums[i];
}
}
//如果不存在第三大的数就返回我们的最大的数,即第一个元素
return nums[0];
};
//由升序的数组变为倒序的数组我们用的方法是将第一个元素与最后一个元素互换,第二个元素与倒数第二个元素互换这样的方法来做的
function reverse(nums){
var right=nums.length-1;
var left = 0;
while(left<right){
var temp=nums[right];
nums[right]=nums[left];
nums[left]=temp;
left++;
right--;
}
}
反思:做这样的题往往只能做出来一部分,会有一些地方卡住,或者就算是想明白了也不会表达,就像是是力扣里面的那句很流行的话“简单题我重拳出击,中等题我唯唯诺诺,困难题我复制粘贴”。哈哈哈哈哈哈,加油,祝你也祝我!