劍指offer 最小k個數

2021-09-18 04:32:00 字數 1422 閱讀 6770

1. 題目:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

2. 方法:

(1)基於堆排序演算法,構建最大堆。時間複雜度為o(nlogk)

(2)如果用快速排序,時間複雜度為o(nlogn);

(3)如果用插入排序,時間複雜度為o(n^2)。

3.演算法

(1):最大堆

/*

1.判斷特殊情況:k的大小,k==0或k的長度大於input返回空。

2.設定priorityqueue的比較為降序(最大堆),預設的自然序為公升序。(用priorityqueue實現堆,非執行緒安全)

3.在堆中新增元素,若堆大小function3(int input,int k)

priorityqueuequeue=new priorityqueue<>(k, new comparator()

});for (int i=0;iinput[i])}}

while (!queue.isempty())

return list;

}

用priorityqueue實現最大堆,priorityqueue有動態維護最大堆的功能。詳情: 

(2):快排

public static arraylistfunction1(int  array,int k)

return list;

}

使用arrays.sort()函式,自動排序。 

(3):插入

/**

直接在list.add時排序

1. 若list長度input[i],則在t之後插入(因為list.get(t)=0,若list.get(t-1)會報錯。

!!!2. arraylist.sublist(start,end),擷取長度為(end-start)的list,注意返回為list不是arraylist,且為檢視(對它改變會改變原物件).

3. list->arraylist:新建arraylist物件,再使用addall()函式。

*/public static arraylistfunction2(int input,int k)

list.add(input[0]);

for (int i = 1; i < input.length; i++)

}arraylistnewlist=new arraylist<>();

newlist.addall(list.sublist(0,k));

return newlist;

}

劍指offer 最小的K個數

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...

《劍指offer》最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...

劍指offer 最小的K個數

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。這道題目我是參考乙個部落格的,具體位址找不到了,這裡我就說說現在我對這道題目的理解吧,這道題目核心就是遞迴,可能...