414. 第三大的数

104 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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. 首先排除数组为1个元素或2个元素的情况。
  2. 对数组先冒泡排序,从小到大。
  3. 然后从排序后数组中找最大的,肯定是最后一个元素了。再找第二大,遍历一下,肯定离他最近的那个,如果没有就输出最大(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;
}