携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
一、题目描述:
414. 第三大的数 - 力扣(LeetCode) (leetcode-cn.com)
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
- 1 <= nums.length <= 10^4
- -2^31 <= nums[i] <= 2^31 - 1
进阶: 你能设计一个时间复杂度 O(n) 的解决方案吗?
二、思路分析:
- 首先排除数组为1个元素或2个元素的情况。
- 对数组先冒泡排序,从小到大。
- 然后从排序后数组中找最大的,肯定是最后一个元素了。再找第二大,遍历一下,肯定离他最近的那个,如果没有就输出最大(else要把老大排除掉),说明是一样的,如果有就接着找老三,还是跟找老二一样,离老二最近的,如果走if就保存,在标记一下,如果走else(排除掉老大老二)就输出老大。
三、AC 代码:
int thirdMax(int* nums, int numsSize) {
int one_num = 0;
int two_num = 0;
int mid_num = 0;//排序交换
int target = 0;//老三
int mark = 0;//标记老三
if (numsSize == 1) {
return nums[0];
}
else if (numsSize == 2) {
return nums[0] > nums[1] ? nums[0] : nums[1];
}
else {
for (int i = 0; i < numsSize; i++) {//从小到大排序
for (int j = 0; j < numsSize-1; j++) {
if (nums[j] > nums[j + 1]) {
mid_num = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = mid_num;
}
}
}
one_num = nums[numsSize - 1];//老大
for (int i = 0; i < numsSize-1; i++) {//找老二
if (nums[i] < one_num)
two_num = nums[i];
else {
if (nums[i] == one_num)
break;//如果是老大在验证就跳出
else
return one_num;//如果老二没有就是相同的数
}
}
for (int i = 0; i < numsSize - 1; i++) {//找老三
if (nums[i] < two_num){
target = nums[i];//有老三就找到离老二最近的
mark = 1;//标记老三
}
else {
if(mark==1)
break;
else
return one_num; //如果没老三输出老大
}
}
}
return target;
}