查找数组中第K大的数

本文介绍了一种在未排序数组中查找第K大的元素的方法。通过遍历数组并使用两个指针来跟踪当前最大值和前一次的最大值,最终找到指定位置的元素。这种方法适用于不需要完全排序的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如在数组{1, 3, 5, 4, 2, 8, 6}中找出第3大的数应该返回5,实现如下:

在Java中,可以使用多种算法来找到数组中的第k的元素,这里提供一种基于快速选择(QuickSelect)的解决方案,它是一种改进版的快速排序算法,适用于解决“找出第k/小元素”的问题,而不是完全排序整个数组: ```java public class KthLargest { public static int findKthLargest(int[] nums, int k) { if (nums == null || nums.length == 0 || k < 1 || k > nums.length) { throw new IllegalArgumentException("Invalid input"); } return quickSelect(nums, 0, nums.length - 1, k); } private static int partition(int[] nums, int left, int right, int pivotIndex) { int pivotValue = nums[pivotIndex]; swap(nums, pivotIndex, right); // 将pivot放在末尾 int storeIndex = left; for (int i = left; i < right; i++) { if (nums[i] > pivotValue) { swap(nums, i, storeIndex); storeIndex++; } } swap(nums, storeIndex, right); // 将pivot放回正确的位置 return storeIndex; } private static void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } private static int quickSelect(int[] nums, int left, int right, int k) { if (left == right) { // 基线条件:只有一个元素,直接返回 return nums[left]; } int pivotIndex = partition(nums, left, right, (left + right) / 2); // 随机选取pivot if (k == pivotIndex) { return nums[k]; // 找到的就是pivot } else if (k < pivotIndex) { // k小于pivot,继续在左半部分查找 return quickSelect(nums, left, pivotIndex - 1, k); } else { // k于pivot,继续在右半部分查找 return quickSelect(nums, pivotIndex + 1, right, k); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值