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

题目描述:

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

示例 1:

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

示例 2:

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

说明:

你可以假设 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开始到数组长度减一))

具体代码:

 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 

发布了43 篇原创文章 · 获赞 6 · 访问量 6678

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/87989434