zoukankan      html  css  js  c++  java
  • 数组中的第K个最大元素

    在未排序的数组中找到第 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个元素是可以相同的,那么是可以用小顶堆来做的。 

    假设小顶堆的大小为k,那么堆顶就为第k个元素

    时间复杂度为 新建堆的大小1/2 * k * logk

    遍历 (n - k)*logk

    总时间复杂度为nlogk的级别

    class Solution {
        public int findKthLargest(int[] nums, int k) {
            int[] arr = new int[k];
            int len = nums.length;
            for (int i = 0; i < k; i++) {
                arr[i] = nums[i];
            }
            init(arr);
            for (int i = k; i < len; i++) {
                if (nums[i] < arr[0]) {
                    continue;
                } else {
                    arr[0] = nums[i];
                    down(arr, 0);
                }
            }
            return arr[0];
        }
    
        
        public void init(int[] data)
        {
            int len = data.length;
            for (int i = len/2 - 1; i >= 0; i--) {
                down(data, i);
            }
        }
        
        public void down(int[] data, int root)
        {
            int head = root;
            int headval = data[root];
            int left = head * 2 + 1;
            int right = left + 1;
            int next = left;
            int len = data.length;
            while (left < len) {
                if (right < len && data[right] < data[left]) {
                    next = right;
                }
                if (data[next] < headval) {//注意这里,一直是和headval做比较的
                    data[head] = data[next];
                } else {
                    break;
                }
                head = next;
                left = head * 2 + 1;
                right = left + 1;
                next = left;
            }
            data[head] = headval;
        }
    }
  • 相关阅读:
    仿windows的嵌入式GUI系统(一)
    入群必看内容。
    嵌入式开发入门(2)
    仿windows消息机制的嵌入式GUI系统(二)(未完)
    使用硬件定时器软模拟多个定时器(8.15改进版)
    Python 文件目录操作
    C/C++ cast
    C/C++ basic
    C/C++ debug
    C++ 引用返回值
  • 原文地址:https://www.cnblogs.com/tobemaster/p/12423146.html
Copyright © 2011-2022 走看看