nth element問題,劍指offer40

2021-10-22 04:48:27 字數 1722 閱讀 7812

前言

一、什麼是快速選排思想

二、簡單寫法

總結排序可以很快的解決這個問題,但是這樣的話時間複雜度為o(nlogn),這樣的話並不理想。

快排的思想可以很輕鬆的解決這個問題,但需要注意的是,這個方法的並不是很穩定,也就是運氣型演算法,這個演算法時間複雜度期望是o(n)

簡單來說,快排的思想就是在執行之後,將它放在它應在的位置上,同時這個位置的左側所有數全部小於等於它,右面的所有數都大於等於它,當然也可時右側的數都大於它,只需要稍微動一下判斷條件就可以了。

**如下(示例):

class solution 

//此時只需要對基準值和當前l的位置進行乙個數值的交換,就完成了

//交換完之後,l左側的數都會小於等於基準值,右側的數值都會大於等於基準值

swap

(arr[start]

, arr[l]);

return l;

//在進行完一次partition之後,返回當前這個數的位置

//如果運氣夠好的話,一次性直接返回l == k - 1,那可真是太幸運了

} vector<

int>

getleastnumbers

(vector<

int>

& arr,

int k);if

(k >= n)

return arr;

int ind =

partition

(arr,

0, n -1)

, l =

0, r = n -1;

//當返回的下標並是我想要的k- 1之後會繼續求下標的這個過程

while

(ind != k -1)

return;}

};

為什麼說是不嚴謹呢,雖然也滿足快速選排的思想,但是我沒有考慮隨機性選出乙個基準值這個問題,有興趣的可以看一下官方的題解,還有劍指offer書。

執行效果:劍指offer的測評機的波動有時候會很大,這是最好的情況,綜合多次提交,平均大概24ms。

對於這個題,解決的方法有很多很多,如果可以開闢額外空間,那麼優先佇列(堆),還有二叉搜尋樹都是乙個很好的選擇。c++stl其中含有優先佇列,或者自行實現乙個堆都不是很麻煩的過程。

二叉搜尋樹的話,如果不是再leetdode平台做題的話,自行實現也會很簡單,只需要構建乙個類

struct node
但是在leetcode上就很難受,因為不讓改結構的定義,就需要乙個unordered_map或者是map再或者是直接陣列下標對映來存值。

大概思想,將陣列中的數構建出乙個二叉搜尋樹,然後直接中序遍歷取出對應的數字就可以了,但是為什麼說沒有必要呢,因為實際上構建二叉搜尋樹的過程就是乙個快速排序的過程,本質是一樣的。

在上面的一欄中,之所以選擇基於快速選排思想,而不是直接進行乙個快速排序,就是因為直接進行排序的話會將時間複雜度變為o(nlogn),因為做了很多實際上並不必要的排序。

二叉搜尋樹還會存在的乙個問題就是,在構建完二叉搜尋樹之後,遍歷時圖省事直接進行遞迴中序遍歷的話,資料量極大的情況下,隨隨便便就爆棧了,畢竟系統棧空間就那8m

下面的是這道題的鏈結,有興趣可以做一下,如果我有幸被您看到了這篇文章,希望發現了錯誤的您可以告之我。

劍指offer40

劍指offer 問題29

package offer offer interview 29 public class test29 int result numbers 0 int count 1 for int i 1 i numbers.length i else if result numbers i else cou...

劍指offer刪除鍊錶節點O(1)演算法

題目描述 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。解題思路 1 常規思路 在單向鍊錶中刪除乙個結點,最常規的做法無疑是從鍊錶的頭結點開始,順序遍歷查詢要刪除的結點,並在鍊錶中刪除該結點。這種思路由於需要順序查詢,時間複雜度自然就是o n 2 正確思路 我們可以很方便...

劍指offer 八皇后問題

劍指offer上解決八皇后問題,沒有用傳統的遞迴或非遞迴回溯法,而是用了很巧妙的全排列法。先說下八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。全排列解決八皇后問題的思路如下 由於8個皇后不能處在同一行,...