当前位置: 首页 > news >正文

求第K大元素-Java-数组中数据可重复

求第K大元素-Java-数组中数据可重复

1、题目描述

一个非空大的整数数组,至少有3个元素,可正可负;

求第三大的元素,

测试用例:

[6,5,4,4,1,2]  

输出:4

 

2、解决方法一:大小为k的小根堆


import java.util.PriorityQueue;
import java.util.Scanner;

public class Main1 {

	/**
	 * @param args
	 *            【查找第k大的元素】,数组有重复数字出现 ,数字可正可负
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		String s = in.nextLine().trim();
		String strs[] = s.substring(1, s.length() - 1).split(",");
		int nums[] = new int[strs.length];
		for (int i = 0; i < strs.length; i++) {
			nums[i] = Integer.parseInt(strs[i]);
		}
		// 使用size为3的小根堆实现
		System.out.println(findKthLargest(nums, 3));

	}

	public static int findKthLargest(int[] nums, int k) {
		// 大小为k的小根堆,比根大的数都可进入小根堆,小根堆大小最大不超过3
		// 遍历完毕,则根节点即为所求
		PriorityQueue<Integer> q = new PriorityQueue<Integer>(k);
		for (int i : nums) {
			q.offer(i);

			if (q.size() > k) {
				q.poll();
			}
		}

		return q.peek();
	}

}

3、解决方法二:快速排序+优化比较,找到就可返回结果并退出


import java.util.Scanner;

public class Main2 {

	/**
	 * @param args
	 *            【查找第k大的元素】,数组有重复数字出现 ,数字可正可负
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		String strs[] = in.nextLine().trim().split(",");
		int nums[] = new int[strs.length];
		for (int i = 0; i < strs.length; i++) {
			nums[i] = Integer.parseInt(strs[i]);
		}
		System.out.println(findKthLargest(nums, 2));

	}

	public static int findKthLargest(int[] nums, int k) {
		if (k < 1 || nums == null) {
			return 0;
		}

		return getKth(nums.length - k + 1, nums, 0, nums.length - 1);
	}

	public static int getKth(int k, int[] nums, int start, int end) {

		int pivot = nums[end];

		int left = start;
		int right = end;

		while (true) {

			while (nums[left] < pivot && left < right) {
				left++;
			}

			while (nums[right] >= pivot && right > left) {
				right--;
			}

			if (left == right) {
				break;
			}

			swap(nums, left, right);
		}

		swap(nums, left, end);

		if (k == left + 1) {
			return pivot;
		} else if (k < left + 1) {
			return getKth(k, nums, start, left - 1);
		} else {
			return getKth(k, nums, left + 1, end);
		}
	}

	public static void swap(int[] nums, int n1, int n2) {
		int tmp = nums[n1];
		nums[n1] = nums[n2];
		nums[n2] = tmp;
	}

}

参考链接;

https://blog.csdn.net/hzh_csdn/article/details/53446211

 

相关文章:

  • 数组移动跳跃-Java
  • Java-查找数组众数:众数出现次数超过n/2次,n为数组长度
  • java 错误:The type java.util.Comparator cannot be resolved. It is indirectly referenced from required
  • 错误:Could not find main class : test.test.Program will exit
  • VTK-java版本-连续渐变的颜色映射表设置
  • Windows-64位环境下载并安装Python3.5.4
  • Windows -64 安装python3.5.2
  • 下载并安装Anaconda
  • Windows下安装TensorFlow教程(cpu版本)
  • VS2015下载地址-镜像文件
  • VS2015安装教程
  • 查看Windows下TensorFlow对python版本的要求
  • 查看本机显卡配置是否支持安装gpu版本的tensorflow
  • cuda安装教程+cudnn安装教程
  • Win10下安装tensorflow教程(cpu版本和GPU版本)
  • Android组件 - 收藏集 - 掘金
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • es6--symbol
  • HTML-表单
  • Java编程基础24——递归练习
  • Java反射-动态类加载和重新加载
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • PAT A1120
  • PHP 小技巧
  • Rancher-k8s加速安装文档
  • vue-loader 源码解析系列之 selector
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 力扣(LeetCode)357
  • 排序算法学习笔记
  • 使用agvtool更改app version/build
  • 大数据全解:定义、价值及挑战
  • ​io --- 处理流的核心工具​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #《AI中文版》V3 第 1 章 概述
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #pragma multi_compile #pragma shader_feature
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (Oracle)SQL优化技巧(一):分页查询
  • (翻译)terry crowley: 写给程序员
  • (分类)KNN算法- 参数调优
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (算法二)滑动窗口
  • (转)http-server应用
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • ../depcomp: line 571: exec: g++: not found
  • .NET Micro Framework初体验(二)
  • .net 后台导出excel ,word
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net/c# memcached 获取所有缓存键(keys)
  • .net6 webapi log4net完整配置使用流程
  • .NET开发者必备的11款免费工具
  • .net下简单快捷的数值高低位切换
  • .net与java建立WebService再互相调用