215. Kth Largest Element in an Array找出数组中第k大的值
堆排序做的,没有全部排序,找到第k个就结束
- public int findKthLargest(int[] nums, int k) {
- int num = 0;
- if (nums.length <= 1)
- return nums[0];
- int heapSize = nums.length;
- //1.构建最大堆
- int half = (heapSize-2)/2;
- for (int i = half;i >= 0;i--)
- {
- adjust(nums,heapSize,i);
- }
- while (heapSize > 1)
- {
- //2.取出最大值
- swap(0,heapSize-1,nums);
- heapSize--;
- num++;
- if(num == k)
- break;
- //3.调整堆
- adjust(nums,heapSize,0);
- }
- return nums[nums.length-k];
- }
- public void adjust(int[] nums,int heapSize,int index)
- {
- int left = index*2+1;
- int right = index*2+2;
- int biggest = index;
- if (left < heapSize && nums[left] > nums[biggest])
- biggest = left;
- //注意这里都是和nums[biggest]比较,别写成index,因为要找出最大的值
- if (right < heapSize && nums[right] > nums[biggest])
- biggest = right;
- if (biggest != index)
- {
- swap(index,biggest,nums);
- adjust(nums,heapSize,biggest);
- }
- }
- public void swap(int a,int b,int[] nums)
- {
- int temp = nums[a];
- nums[a] = nums[b];
- nums[b] = temp;
- }
堆排序的算法时间复杂度是:O(n*log k )
下边快排的改进做法,O(n)
利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
- public void findk(int[] nums,int sta,int end,int k)
- {
- if (sta>end) return;
- Random random = new Random();
- int p = random.nextInt(end-sta)+sta;
- swap(nums,p,sta);
- int l = sta;
- int r = end;
- while (l<r)
- {
- while (l<r&&nums[r]>=nums[sta])
- r--;
- while (l<r&&nums[l]<=nums[sta])
- l++;
- swap(nums,l,r);
- }
- swap(nums,l,sta);
- //记录右边数组(包括排序好的数)的大小
- int size = end-l+1;
- if (size == k) System.out.println(nums[l]);
- else if (size<k) findk(nums,sta,l-1,k-size);
- else findk(nums,l,end,k);
- }
- public void swap(int[] nums,int i ,int j)
- {
- int temp = nums[i];
- nums[i] = nums[j];
- nums[j] = temp;
- }
215. Kth Largest Element in an Array找出数组中第k大的值的更多相关文章
- 前端算法题:找出数组中第k大的数字出现多少次
题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...
- 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...
- 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array
传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5, ...
- leetcode 215. Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
- LN : leetcode 215 Kth Largest Element in an Array
lc 215 Kth Largest Element in an Array 215 Kth Largest Element in an Array Find the kth largest elem ...
- LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解
题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/ 215. Kth Largest Element in an A ...
- [LeetCode] 215. Kth Largest Element in an Array 数组中第k大的数字
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 【LeetCode】215. Kth Largest Element in an Array (2 solutions)
Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...
随机推荐
- 蒲公英 · JELLY技术周刊 Vol.32: 前端的自我进化之路
蒲公英 · JELLY技术周刊 Vol.32 前端开发不过是切图仔在那儿瞎鼓捣,没啥门槛,不需要懂计算机原理,不需要懂算法,微服务.高并发这些都不需要懂,拖组件写个页面就好了,数据.逻辑.测试都可以交 ...
- LeetCode 026 Remove Duplicates from Sorted Array
题目描述:Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such t ...
- python数据更新
def cal(s,m): if s==u"废弃" or s==u"拆除": return 4 elif s==u"竣工": return ...
- DRF的ModelSerializer的使用
在views中添加 from django.shortcuts import render # Create your views here. from rest_framework.views im ...
- dart时间处理的几个方法
一.时间处理的方法 1.获取当前时间 new DateTime.now(); 2.设置时间 new DateTime(2020, 11, 11, 12, 37 , 36); 3.解析时间 DateTi ...
- PyQt(Python+Qt)学习随笔:QTableWidget的属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.概述 除了从父类继承的属性外,在Designer中QTableWidget只有两个属性,就是行数 ...
- Python正则表达式\W+和\W*匹配过程的深入分析
在学习re.split函数的处理过程中,发现执行如下语句及返回与老猿预想的不一致: >>> re.split('\W*','Hello,world') ['', 'H', 'e', ...
- Python+Qt学习随笔:PyQt图形界面应用的事件处理流程
图形界面的事件处理是界面操作的核心,经过编写测试程序验证,基本确认PyQt图形界面应用程序的事件处理流程如下: 1.操作系统或其他应用发送消息给应用主程序: 2.应用主程序调用notify将消息队列中 ...
- Springboot集成swagger和knife
前言 knife4j是在swagger的基本上做做了一次封装,主要体现在ui表现,所有在使用前必须先搭建好swagger2,其实是swagger和knife都可以访问, 至于哪个好用全看个人! swa ...
- ASP数据库连接方法语法总结
经常使用到有关数据库的操作.包括连接代码,SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去.一些比较少用的数据库还不一定能顺利找到,所以现在把 ...