1. 程式人生 > >劍指offer之找出陣列中最小的n個數,之優先佇列

劍指offer之找出陣列中最小的n個數,之優先佇列

這道題最簡單的就是排序,時間複雜度O(nlogn)。

不再講述。

這裡可以使用優先佇列,時間複雜度O(nlogk)。

注意檢驗k的合法性,不然初始化佇列時會報錯。

import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.Queue;

public class Solution {
  public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
      ArrayList<Integer> arrayList = new ArrayList<>();

      if(null == input || 0 == input.length || k<=0 || k > input.length){
        return arrayList;
      }
    Queue<Integer> queue =  new PriorityQueue<>(k, Collections.reverseOrder());
      for(int i =0;i < input.length;i++){
        if(queue.size() < k){
          queue.add(input[i]);
        }else{
          if(input[i] < queue.peek()){
            queue.remove();
            queue.add(input[i]);
          }
        }
      }
      while(!queue.isEmpty()){
        arrayList.add(queue.remove());
      }
      return arrayList;
  }

  public static void main(String[] args){
    int[] array = {1,2,3,2,2,2,5,4,2};
    Solution solution = new Solution();
    System.out.println(solution.GetLeastNumbers_Solution(array,3));
  }
}

相關推薦

offer陣列n個數優先佇列

這道題最簡單的就是排序,時間複雜度O(nlogn)。不再講述。這裡可以使用優先佇列,時間複雜度O(nlogk)。注意檢驗k的合法性,不然初始化佇列時會報錯。import java.util.ArrayL

Offer-3 陣列重複的數字

題目: 給定一個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0∼n−1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。 注意:如果某些數字不在 0∼n−1 的範圍內,或陣列中不包含重複數字,則返回 -1

offer 1. 陣列重複的數字

給定一個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0∼n−1 的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。 請找出陣列中任意一個重複的數字。 注意:如果某些數字不在 0∼n−1 的範圍內,或陣列中不包含重複數字,則返回 -1;

Offer】05旋轉陣列數字

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。 時間

offer Python版 - 旋轉陣列數字

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0

offer》系列 把陣列排成的數(Java)

連結 牛客:把陣列排成最小的數 題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 思路 1、全排列 求出陣列中所有數字的全排列

Offer - 6:旋轉陣列數字

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列 {3, 4, 5, 1, 2} 為 { 1, 2, 3, 4, 5 } 的一個旋轉,該陣列的最小值為1。 NOTE:給

offer-06:旋轉陣列數字

問題 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

offer-32:把陣列排成的數

題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 思路 一開始我也以為是一個全排列的問題,後來看了下劍指offer發現作者有一個更好的實現方式

bfprt演算法----陣列的k個數(Java)

 無序陣列中最小的k個數 對於一個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數。 給定一個整數陣列A及它的大小n,同時給定k,請返回其中最小的k個數。 測試樣例: [1,2,4,3],4,2 返回:[1,2] (1)利用堆,時間複雜度O(Nlog

offer》系列 旋轉陣列數字(Java)

連結 題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大

offer】32把陣列排成的數

/** *輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。 *例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 */ i

陣列的 K 個數

給定一個長度為 n 的陣列,要求輸出陣列中最小的 K 個數(k<n)。 思路: 最簡單的思路是將陣列進行排序,由小到大排序,則陣列最前面的 K 個既我們要求的。 但是這樣的時間複雜度為 nlon

offer陣列出現次數超過一半的數字

找出陣列中出現次數超過一半的數字 歡迎關注作者簡書 csdn傳送門 題目   一個數組中有一個數字的次數超過了陣列的一半,求出這個字元。如:int a[] = {2,3,2,2,2,2,2,5,4,1,2,3},求出超過一半的數字是2 分析 解法一

offer -- 數字在排序陣列出現的次數

題目描述 統計一個數字在排序陣列中出現的次數。 解題思路 因為題目給出的陣列是排序了的,所以我們想到了二分查詢。利用二分查詢找到一個數字在陣列中第一次出現的位置和最後出現的位置即可。 AC程式碼 public class Solution { public int

offer第3:陣列重複的數字

題目描述 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。 # -*- c

offer系列(十二)的k個數 連續子陣列大和整數1出現的個數

最小的k個數 題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 解題思路: 思路1,這一題應用堆排序演算法複雜度只有O(nlog k),堆是完全二叉樹的一種,最大堆就是最上面的數是最大的,該方法基於二

offer》二維陣列的查詢

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 class Solution { public: bool Find(int t

offer——(5)陣列出現次數超過一半的數字

三種思路可選。  public class Solution { /* 渣渣暴力求解法:時間複雜度為n!,從0位遍歷陣列,與當前位置的下一位數字判斷是否相等,相等則 count+1,將出現次數用countTemp儲存,每次迴圈比較一下有沒有出現次數更多的數字,

offer(1)二維陣列的查詢

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 解題思路 方法一 最最最簡單的,直接便利全部元素,有相同的就返回true,沒有就返回