21 劍指offer 最小的K個數字

2021-09-26 18:44:38 字數 1069 閱讀 1686

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

解題思路:

思路1:首先是乙個簡單的解題思路,利用乙個priority_queue的優先佇列結構,這個結構的特點是佇列首元素是該佇列中最大的元素,因此首先將input中的前k個元素壓入priority_queue,之後遍歷一遍該陣列,陣列的每乙個元素與priority_queue中的首元素進行比較,如果比首元素小則壓入priority_queue,彈出首元素即可,時間複雜度主要是priority_queue內部排序造成的o(nlog(k))。

class solution 

for (int i = 0; i < k; i++)

for (int i = k; i < len; i++)

}//vectorret;

int cnt = k;

while(cnt--)

return ret;

}};

思路2:太巧妙了!利用近似o(n)就可以解決問題的演算法!利用partition演算法的思想(詳情請見我的部落格partition 演算法詳解 + 應用 + **實現(一)),每一次遍歷陣列的時候,都可以先隨機確定乙個priovot的值,然後不停遍歷陣列,大於等於privot的都在privot右邊,小於等於privot的都在privot左邊,當privot左邊的長度恰好為k時,遍歷結束,輸出這k個元素即為答案。

**如下:

class solution 

arr[endd] = privot;

return beginn;

}vectorgetleastnumbers_solution(vectorinput, int k)

int pos = partition(input, 0, len);

while (pos + 1 != k)

else if (pos + 1 < k)

}for (int i = 0; i < pos + 1; i++)

return ret;

}};

小白感嘆演算法真奇妙

劍指offer 最小k個數

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.演...

劍指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。附 這只是乙個比較簡單的方法。如果考慮...