zoukankan      html  css  js  c++  java
  • 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 Array

    My Submissions
    Total Accepted: 43442 Total Submissions: 136063 Difficulty: Medium

    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.

    Credits:
    Special thanks to @mithmatt for adding this problem and creating all test cases.

    Subscribe to see which companies asked this question

    Show Tags
    Show Similar Problems
    Have you met this question in a real interview? 
    Yes
     
    No

    Discuss


        求给定数组的第K大的元素。

    假设先排序,然后取第K个元素,那么时间复杂度是O(n*log n)。

    借助堆的数据结构,能够把时间复杂度降到O(n*logk)。

        假设求第K大的元素,那么要构建的是小顶堆。

    求第K小的元素。那么要构建大顶堆!先构建k个元素的堆。另外i-k个元素逐个跟堆顶元素比較。假设比堆顶元素小,那么就将该元素纳入堆中,并保持堆的性质。

        我的AC代码

    public class KthLargestElementinanArray {
    
    	public static void main(String[] args) {
    		int[] a = { 3, 2, 1, 5, 6, 4 };
    		System.out.println(findKthLargest(a, 1));
    		int[] b = { -1,2,0};
    		System.out.println(findKthLargest(b, 3));
    		int[] c = { 3,1,2,4};
    		System.out.println(findKthLargest(c, 2));
    
    	}
    
    	public static int findKthLargest(int[] nums, int k) {
    		int[] heap = new int[k];
    
    		heap[0] = nums[0];
    		for (int i = 1; i < k; i++) {
    			siftUp(nums[i], heap, i);
    		}
    
    		for (int i = k; i < nums.length; i++) {
    			siftDown(nums, k, heap, i);
    		}
    
    		return heap[0];
    	}
    
    	private static void siftDown(int[] nums, int k, int[] heap, int i) {
    		if (nums[i] > heap[0]) {
    			heap[0] = nums[i];
    			int p = 0;
    			while(p < k) {
    				int minChild = 2 * p + 1;
    				if(minChild + 1 < k && heap[minChild] > heap[minChild + 1]) minChild ++;
    				if(minChild < k && heap[p] > heap[minChild]) {
    					swap(heap, p, minChild);
    					p = minChild;
    				} else break;
    			}
    		}
    	}
    
    	private static void siftUp(int num, int[] heap, int i) {
    		int p = i;
    		heap[i] = num;
    		while (p != 0) {
    			int parent = (p - 1) / 2;
    			if (heap[parent] > heap[p]) {
    				swap(heap, p, parent);
    			}
    			p = parent;
    		}
    	}
    
    	private static void swap(int[] heap, int p, int parent) {
    		int temp = heap[parent];
    		heap[parent] = heap[p];
    		heap[p] = temp;
    	}
    }
    


  • 相关阅读:
    fckeditor上传问题的解决
    重装系统
    JQuery中文日期控件
    Log4Net使用心得
    not过滤的几种写法
    三级日期选择
    Log4Net本地正常,发布到服务器却不能工作
    工具栏设置大按钮
    Log4Net与Log2Console配合时中文问题的解决
    服务器不能发邮件
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7061159.html
Copyright © 2011-2022 走看看