zoukankan      html  css  js  c++  java
  • 215. Kth Largest Element in an Array

        /*
         * 215. Kth Largest Element in an Array 
         * 12.18 by Mingyang
         * 所以绞尽脑汁想来想去还是得用priority queue
         * 但是我们这里是直接用PQ,其实我们可以用一个heap来implement
         * 也可以用quick sort的方法更好,平均可以做到n
         */
         public int findKthLargest(int[] nums, int k) {
                PriorityQueue<Integer> p = new PriorityQueue<Integer>();
                for(int i = 0 ; i < nums.length; i++){
                    p.add(nums[i]);
                    if(p.size()>k) p.poll();
                }
                return p.poll();
            }
         /*
          * 先取一个枢纽值,将数组中小于枢纽值的放在左边,大于枢纽值的放在右边,
          * 具体方法是用左右两个指针,如果他们小于枢纽值则将他们换到对面,
          * 如果这个分界点是k,说明分界点的数就是第k个数。
          * 否则,如果分界点大于k,则在左半边做同样的搜索。
          * 如果分界点小于k,则在右半边做同样的搜索。
          */
          public int findKthLargest1(int[] nums, int k) {
                return quickSelect(nums, k - 1, 0, nums.length - 1);
            }
            
            private int quickSelect(int[] arr, int k, int left, int right){
                int pivot = arr[(left + right) / 2];
                int orgL = left, orgR = right;
                while(left <= right){
                    // 从右向左找到第一个小于枢纽值的数
                    while(arr[left] > pivot){
                        left ++;
                    }
                    // 从左向右找到第一个大于枢纽值的数
                    while(arr[right] < pivot){
                        right --;
                    }
                    // 将两个数互换
                    if(left <= right){
                        swap(arr, left, right);
                        left ++;
                        right --;
                    }
                }
                // 最后退出的情况应该是右指针在左指针左边一格
                // 这时如果右指针还大于等于k,说明kth在左半边
                if(orgL < right && k <= right) return quickSelect(arr, k, orgL, right);
                // 这时如果左指针还小于等于k,说明kth在右半边
                if(left < orgR && k >= left) return quickSelect(arr, k, left, orgR);
                return arr[k];
            
            }        
            private void swap(int[] arr, int idx1, int idx2){
                int tmp = arr[idx1] + arr[idx2];
                arr[idx1] = tmp - arr[idx1];
                arr[idx2] = tmp - arr[idx2];
            
            }
  • 相关阅读:
    Comparator
    Compare接口
    Predicate接口和Consumer接口
    Lambda表达式遍历集合
    Lambda表达式入门
    RansomNote
    FirstUniqueCharacterInString
    String All Methods
    形参个数可变的方法(...)
    springBoot excel导出 下载 超简单
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5576997.html
Copyright © 2011-2022 走看看