LeetCode.215 Kth Largest Element in an Array 找出k个最大的(*****经典必备题*****)
2017-11-26 23:15
288 查看
题目:
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For example,
Given
You may assume k is always valid, 1 ≤ k ≤ array's length.
分析(利用PriorityQueue优先队列实现):class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
//PriorityQueue是一个基于优先级堆,此队列的头相对于指定的排序是最小的元素。
//一个具有指定的初始容量。并且按自然排序。
PriorityQueue<Integer> largeK=new PriorityQueue<Integer>();
for(int n:nums){
if(largeK.size()<k){
largeK.add(n);
}else{
//集合中已经存在k个元素
//判断是否小于最小值
if(n>largeK.peek()){
largeK.poll();
largeK.add(n);
}
}
}
//最小的就是第k个结果
return largeK.poll();
}
}
分析2(简介版PriorityQueue):
class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
//PriorityQueue是一个基于优先级堆,此队列的头相对于指定的排序是最小的元素。
//一个具有指定的初始容量。并且按自然排序。设置k+1方便当size大于k时,剔除最前面的。
PriorityQueue<Integer> largeK=new PriorityQueue<Integer>(k+1);
for(int n:nums){
//添加元素
largeK.add(n);
//如果长度大于k,则提出最小的,也就是最前面的
if(largeK.size()>k){
largeK.poll();
}
}
//最小的就是第k个结果
return largeK.poll();
}
}
分析3(List实现-时间复杂度较高):
class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
if(list.size()<k){
list.add(nums[i]);
}else{
//已经存在k个元素
int min=0;
//找出集合中最小的下标,和当前元素进行类比
for(int j=1;j<list.size();j++){
if(list.get(j)<list.get(min)){
min=j;
}
}
//类比
if(nums[i]>list.get(min)){
//在最小值位置替换
list.set(min,nums[i]);
}
}
}
int res=0;
for(int i=1;i<list.size();i++){
if(list.get(i)<list.get(res)){
res=i;
}
}
return list.get(res);
}
}
分析4(数组-排序实现,时间复杂度最高):
class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
//方法3:使用数组实现,每次都对数组进行排序
int [] array=new int[k];
for(int i=0;i<nums.length;i++){
if(i<k){
array[i]=nums[i];
}else{
//对数组排序
Arrays.sort(array);
if(nums[i]>array[0]){
array[0]=nums[i];
}
}
}
Arrays.sort(array);
return array[0];
}
}
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For example,
Given
[3,2,1,5,6,4]and k = 2, return 5.Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
分析(利用PriorityQueue优先队列实现):class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
//PriorityQueue是一个基于优先级堆,此队列的头相对于指定的排序是最小的元素。
//一个具有指定的初始容量。并且按自然排序。
PriorityQueue<Integer> largeK=new PriorityQueue<Integer>();
for(int n:nums){
if(largeK.size()<k){
largeK.add(n);
}else{
//集合中已经存在k个元素
//判断是否小于最小值
if(n>largeK.peek()){
largeK.poll();
largeK.add(n);
}
}
}
//最小的就是第k个结果
return largeK.poll();
}
}
分析2(简介版PriorityQueue):
class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
//PriorityQueue是一个基于优先级堆,此队列的头相对于指定的排序是最小的元素。
//一个具有指定的初始容量。并且按自然排序。设置k+1方便当size大于k时,剔除最前面的。
PriorityQueue<Integer> largeK=new PriorityQueue<Integer>(k+1);
for(int n:nums){
//添加元素
largeK.add(n);
//如果长度大于k,则提出最小的,也就是最前面的
if(largeK.size()>k){
largeK.poll();
}
}
//最小的就是第k个结果
return largeK.poll();
}
}
分析3(List实现-时间复杂度较高):
class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
if(list.size()<k){
list.add(nums[i]);
}else{
//已经存在k个元素
int min=0;
//找出集合中最小的下标,和当前元素进行类比
for(int j=1;j<list.size();j++){
if(list.get(j)<list.get(min)){
min=j;
}
}
//类比
if(nums[i]>list.get(min)){
//在最小值位置替换
list.set(min,nums[i]);
}
}
}
int res=0;
for(int i=1;i<list.size();i++){
if(list.get(i)<list.get(res)){
res=i;
}
}
return list.get(res);
}
}
分析4(数组-排序实现,时间复杂度最高):
class Solution {
public int findKthLargest(int[] nums, int k) {
//给定数组,超出第k大的数
//思路:利用stack实现,stack中始终保存着k个数据,每次和stack中最小的进行类比,比其大就替换,最后stack中最小的就是结果了
//方法3:使用数组实现,每次都对数组进行排序
int [] array=new int[k];
for(int i=0;i<nums.length;i++){
if(i<k){
array[i]=nums[i];
}else{
//对数组排序
Arrays.sort(array);
if(nums[i]>array[0]){
array[0]=nums[i];
}
}
}
Arrays.sort(array);
return array[0];
}
}
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【215-Kth Largest Element in an Array(数组中第K大的数)】
- leetcode.215. Kth Largest Element in an Array
- 字符串算法——查找数组第K个最大值( Kth Largest Element in an Array)
- 数组-Kth Largest Element in an Array(找出第K大的数)
- leetcode.215.Kth Largest Element in an Array
- [LeetCode] Kth Largest Element in an Array (找出数组的第k大的元素)
- 215. Kth Largest Element in an Array
- Kth Largest Element in an Array
- LeetCode Kth Largest Element in an Array
- Kth Largest Element in an Array
- Kth Largest Element in an Array
- Kth Largest Element in an Array
- 【Top K 问题】[Leetcode-215] Kth Largest Element in an Array 数组中第K大的数
- LeetCode之Kth Largest Element in an Array
- leetcode——Kth Largest Element in an Array
- Kth Largest Element in an Array
- 20170301-leetcode-215-Kth Largest Element in an Array
- 《leetCode》:Kth Largest Element in an Array
- LeetCode(215) Kth Largest Element in an Array
- Leetcode-215 Kth Largest Element in an Array