414. 第三大的数

414. 第三大的数

难度:简单
题目描述
本来这道题不难,但是测试用例好坑,面向测试用例编程了好久
解题思路
类似于大根堆的思想,维护一个长度为3的数组,数组里元素按照从大到小的顺序排序。初始是int型最小值,每添加一个元素,维护数组里的元素大小顺序。
要注意的细节(巨坑)有:
重复的元素不能计算,如果不足三个值要返回最大值。这里的三个值不是数组的长度,是不重复出现的数字,比如111112,就只能算1和2,应该返回2.
还有测试用例
[-2147483648,-2147483648,-2147483648,-2147483648,1,1,1]
[1,2,-2147483648]
解决办法一是初始值设置成long型的最小值
我是设置一个标记位和计数位,如果第一次出现最小值,就把标记位置成false,这样以后再出现最小值就会被忽略掉。
出现一个满足条件的数字,就count++,最后判断count是不是大于3,如果大于3就返回三个数里最小的,如果小于3就返回大的

			/*
			 * 414. 第三大的数
			 * 2020/6/29
			 */
			public int thirdMax(int[] nums) {
				int[] top = new int[3];
				int n = nums.length;
				boolean flag = true;
				if(n == 1) {
					return nums[0];
				}
				if(n == 2) {
					return Math.max(nums[0], nums[1]);
				}
				for (int i = 0; i < top.length; i++) {
					top[i] = Integer.MIN_VALUE;
				}
				sortTop(top);
				int count = 0;
				for (int i = 0; i < nums.length; i++) {
					if(nums[i]==Integer.MIN_VALUE&&flag){
		                count++;
		                flag = false;
		            }
					if(nums[i] != top[0] && nums[i] != top[1] && nums[i] > top[2]) {
						top[2] = nums[i];
						count++;
						sortTop(top);
					}
				}
				if(count >= 3)
					return top[2];
				else {
					return top[0];
				}

		    }
			public void sortTop(int[] top) {
				if(top[0] < top[1]) {
					swap(top, 0, 1);
				}
				if(top[0] < top[2]) {
					swap(top, 0, 2);
				}
				if(top[1] < top[2]) {
					swap(top, 1, 2);
				}
			}
			public void swap(int[] nums,int a,int b) {
				//System.out.println("交换"+nums[a]+" "+nums[b]);
				int temp = nums[a];
				nums[a] = nums[b];
				nums[b] = temp;
			}
			

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值