您的位置:首页 > 编程语言 > Java开发

Leetcode题库-数组中的第K个最大元素(java语言版)

2019-02-27 20:49 253 查看

题目描述:

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [code][3,2,1,5,6,4] 和
k = 2 输出: 5 [/code]

示例 2:

输入: [code][3,2,3,1,2,4,5,5,6] 和
k = 4 输出: 4[/code]

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

  这道题的思路题目说的很明确在数组排序后的第k大的值。首先的进行数组排序,有好多排序方法,也可用内置的排序函数,都可以,这篇博客我用的是选择排序,在我上一篇博客颜色分类用是冒泡排序,具体:https://blog.csdn.net/weixin_37850160/article/details/87988889

然后怎么求第k大的值呢,其实在排好序之后很简单,从大到小排序完后,数组末尾的数就是最大的数,也就是第一大的数,那么第k大的数,只要这个末尾数的下标减去这个k得到的那个数在加上1(听起来很绕口,其实就是数组长度减去k(因为第一大的数就是末尾数。末尾数等于数组长度减1),例如,1,2,3,4,第二大的数是3,用4-2=2刚好是3的下标。(数组下标是从0开始到数组长度减一))

具体代码:

[code] public void findKthLargest(int[] nums, int k) {
//先排序(选择排序(用内置排序,冒泡排序,都可以,我想自己练练选择排序))
int t;
for (int i=0;i<nums.length-1;i++){//每次讲min置成无序组起始位置元素下标
int min=i;
for (int j = i+1;j<nums.length;j++){//遍历无序组,找到最小元素。
if (nums[min]>nums[j]){
min=j;
}
}
//找到最小元素后,判断是不是未排序起始位置的那个元素,是的话就不做操作,不是的话就交换
if (min!=i){
t = nums[i];
nums[i] = nums[min];
nums[min]=t;
}
}

//        按照从小到大排序完后,末尾就是第一大的数,求第k大的数,只需要,减去k即可。(注意:数组下标从0开始。数组长度等于末尾下标加一)
System.out.print(nums[nums.length-k]);

}
public static void main(String[] args){
int a[] = new int[]{3,2,3,1,2,4,5,5,6};
int k = 4;
数组中第k个最大元素 find = new 数组中第k个最大元素 ();
find.findKthLargest ( a,k );
}

执行结果:

执行用时:

  总结:这道题的思路就是排序后从后面最大的那个数如果查找即可。时间复杂度跟排序方法有很大的关系。后面慢慢会更新其他的排序方法。

2018-2-27 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐