Kth Largest Element in an Array

來源:互聯網
上載者:User

標籤:

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

Note: 

You may assume k is always valid, 1 ≤ k ≤ array‘s length.

解題思路:

求一個未排序的數組的第k大的值,其中相同大小的仍然計算大小。並非是不同的第k大的值。

方法一:我們將數組直接排序,第k大的值也就是下標為n-k的值,代碼如下:
</pre><pre name="code" class="cpp">class Solution {public:    int findKthLargest(vector<int>& nums, int k) {        if(nums.size()==0) return 0;        if(nums.size()==1) return nums[0];        sort(nums.begin(),nums.end());        return nums[nums.size()-k];    }};


方法二:我們借鑒快速排序的思想,將數組分成兩部分,前部分小與key值,後部分大於key值,第k大的值就是第n-k+1小的值,也就是前半部分的大小為n-k+1的時候,我們的返回值就是此時的nums[n-k]值,此時前半部分的最大下標為n-k(下標從0開始的)。一旦找到前半部分滿足如此條件,我們就直接返回nums[n-k],不用繼續進行下面的排序工作,代碼如下:
class Solution {public:    int findKthLargest(vector<int>& nums, int k) {              if(nums.size()==0) return 0;        if(nums.size()==1) return nums[0];        int low=0,high=nums.size()-1;        while(low<high)        {            int l=low;            int h=high;            int prio=nums[low];            while(l<h)            {                  while(l<h&&nums[h]>prio) h--;                      swap(nums[h],nums[l]);                while(l<h&&nums[l]<=prio) l++;                      swap(nums[h],nums[l]);            }            nums[l]=prio;            if(l==nums.size()-k) return nums[nums.size()-k];            else if(l>nums.size()-(k)) high=l-1;            else            low=l+1;        }        return nums[nums.size()-(k)];    }};

方法三:同方法二類似,不同的是我們不用由小到大排序,我們從大到小排序,這樣更直觀。代碼如下:
class Solution {public:    int findKthLargest(vector<int>& nums, int k) {        if(nums.size()==0) return 0;        if(nums.size()==1) return nums[0];        int low=0,high=nums.size()-1;        while(low<high)        {            int l=low;            int h=high;            int prio=nums[low];            while(l<h)            {                  while(l<h&&nums[h]<prio) h--;                      swap(nums[h],nums[l]);                while(l<h&&nums[l]>=prio) l++;                      swap(nums[h],nums[l]);                            }            nums[l]=prio;            if(l==k-1) return nums[k-1];            else if(l>k-1) high=l-1;            else            low=l+1;        }        return nums[k - 1];    }};


優缺點分析:利用快排的思想,平均時間複雜度O(n),4ms AC。
直接sort是O(n*log(n))


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Kth Largest Element in an Array

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.