zoukankan      html  css  js  c++  java
  • K Smallest In Unsorted Array

    Find the K smallest numbers in an unsorted integer array A. The returned numbers should be in ascending order.

    Assumptions

    • A is not null
    • K is >= 0 and smaller than or equal to size of A

    Return

    • an array with size K containing the K smallest numbers in ascending order

    Examples

    • A = {3, 4, 1, 2, 5}, K = 3, the 3 smallest numbers are {1, 2, 3}

    M1: min heap

    time: O(n + klogn), space: O(1)

    public class Solution {
      public int[] kSmallest(int[] array, int k) {
        // Write your solution here
        int[] res = new int[k];
        if(array == null || array.length == 0) {
          return res;
        }
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        for(int n : array) {
          minHeap.offer(n);
        }
        for(int i = 0; i < k; i++) {
          res[i] = minHeap.poll();
        }
        return res;
      }
    }

    M2: max heap

    time: O(k + (n-k)logk), space: O(1)

    public class Solution {
      public int[] kSmallest(int[] array, int k) {
        // Write your solution here
        if(array.length == 0 || k == 0) {
          return new int[0];
        }
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k, 
                                                             new Comparator<Integer>() {
                                                               @Override
                                                               public int compare(Integer o1, Integer o2) {
                                                                 if(o1.equals(o2)) {
                                                                   return 0;
                                                                 }
                                                                 return o1 > o2 ? -1 : 1;
                                                               }
                                                             });
        for(int i = 0; i < array.length; i++) {
          if(i < k) {
            maxHeap.offer(array[i]);
          } else if(array[i] < maxHeap.peek()) {
            maxHeap.poll();
            maxHeap.offer(array[i]);
          }
        }
        int[] res = new int[k];
        for(int i = k - 1; i >= 0; i--) {
          res[i] = maxHeap.poll();
        }
        return res;
      }
    }

    M3: quick select

    time: O(n)  worst case O(n^2), space: O(k)

    public class Solution {
      public int[] kSmallest(int[] array, int k) {
        // Write your solution here
        if(array.length == 0 || k == 0) {
          return new int[0];
        }
        quickSelect(array, 0, array.length - 1, k - 1);
        int[] res = Arrays.copyOf(array, k);
        Arrays.sort(res);
        return res;
      }
      
      private void quickSelect(int[] array, int left, int right, int target) {
        int mid = partition(array, left, right);
        if(mid == target) {
          return;
        } else if(mid < target) {
          quickSelect(array, mid + 1, right, target);
        } else {
          quickSelect(array, left, mid - 1, target);
        }
      }
      
      private int partition(int[] array, int left, int right) {
        int pivot = array[right];
        int start = left, end = right - 1;
        while(start <= end) {
          if(array[start] < pivot) {
            start++;
          } else if(array[end] >= pivot) {
            end--;
          } else {
            swap(array, start++, end--);
          }
        }
        swap(array, start, right);
        return start;
      }
      
      private void swap(int[] array, int i, int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
      }
    }
  • 相关阅读:
    C#中关于@的用法
    c++ 中__declspec 的用法
    #pragma详细解释(一)
    memmove 和 memcpy的区别
    【niubi-job——一个分布式的任务调度框架】----安装教程
    [异能程序员]第一章 酒后事发(第一更)
    博客园的最后一篇博文,还是要离开了(附带个人博客源码分享)
    五一假期——技术之路上的坎儿
    deerlet-redis-client添加集群支持,邀请各路大神和菜鸟加入。
    从日常开发说起,浅谈HTTP协议是做什么的。
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10267719.html
Copyright © 2011-2022 走看看