15. 数组中的第K个最大元素
15. 数组中的第K个最大元素
package 数组; import jdk.nashorn.internal.ir.CallNode; import java.util.Random; public class 数组中的第k大元数 { public static void main(String[] args) { int[] nums = {1}; int k = 1; 数组中的第k大元数 o = new 数组中的第k大元数(); System.out.println(o.findKthLargest(nums, k)); } Random random = new Random(); // 快排解法:每次partition都会确定一个数的位置 // 随机取一个数作为基准,进行partition,看prartion的index的情况 // 要是相同,就对了 // 要是大于,就再从前半部分随机选一个数 // 要是小于,就从后半部分随机选一个数 public int findKthLargest(int[] nums, int k) { int m = nums.length - k; return quickSelect(nums, 0, nums.length - 1, m); } public int quickSelect(int[] nums, int start, int end, int k) { int index = partition(nums, start, end); if (index == k) { return nums[index]; } if (index > k) { return quickSelect(nums, 0, index - 1, k); } else { return quickSelect(nums, index + 1, end, k); } } // 7,3,2,9,23,8 public int partition(int[] nums, int start, int end) { if(start==end){ return start; } int i = random.nextInt(end - start) + start; int k = nums[i]; // 把数组头和k交换,这样才好对数组进行分区 swap(nums, i, start); while (start < end) { while (nums[end] > k && start < end) { end--; } if (start < end) { nums[start] = nums[end]; start++; } while (nums[start] < k && start < end) { start++; } if (start < end) { nums[end] = nums[start]; end--; } } nums[start] = k; return start; } public void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-12-02 ZAB协议-Zookeeper一致性协议
2019-12-02 Zookeeper数据类型、节点类型、角色、watcher监听机制