LeetCode 215 陣列中的第K個最大元素

2021-09-01 23:52:59 字數 2218 閱讀 9321

在未排序的陣列中找到第 k 個最大的元素。

請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2

輸出: 5

示例 2:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4

輸出: 4

說明: 你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

一次快速排序**實現:

遞迴呼叫實現快速排序:

方法一(嚴蔚敏方法):

①設定兩個指標,low和high。

②當右邊的數字大於pivot的值,high指標一直減減,直到遇到小於pivot的值。交換low和high的值

③移動low指標,當左邊的數字小於pivot的時候,low指標一直加加,直到遇到大於pivot的值。交換low和high的值

④重複2,3步驟,知道low=high

實現了從小到大的排列

**實現:

public static int partition(int nums,int low,int high) 

nums[low]=nums[high];

while(low方法二:

①設定左右兩個指標,right與left,指向陣列的頭和尾 

②當滿足左指標的數大於pivot並且右指標的數小於pivot,兩個值互換

③如果左指標的數小於pivot,左指標加加 (執行一次)

④如果右指標的數大於piovot,右指標減減 (執行一次)

⑤重複2,3,4步驟 

實現了從小到大的排列 

int partition(vector& nums, int left, int right)

if (nums[l] <= pivot) ++l;

if (nums[r] >= pivot) --r;

}swap(nums[left], nums[r]);

return r;

};

方法一與方法二的區別是:方法一中,某一側的指標一直移動,直到不滿足條件,跳到另一側指標,此時另一側指標一直移動,直到不滿足條件;在方法二中,每次迴圈,兩側的指標都移動,相當於共同逼近中點 

這道題最好的解法應該是下面這種做法,用到了快速排序quick sort的思想,因為是求第k個最大數,所以這裡排序的方向是從大往小排。 

就把大於中樞點的數字放到左半邊,把小於中樞點的放在右半邊,這樣中樞點是整個陣列中第幾大的數字就確定了,雖然左右兩部分不一定是完全有序的,但是並不影響本題要求的結果,所以我們求出中樞點的位置,如果正好是k-1,那麼直接返回該位置上的數字;如果大於k-1,說明要求的數字在左半部分,更新右邊界,再求新的中樞點位置;反之則更新右半部分,求中樞點的位置; 

**實現

方法一:

public static int partition(int nums,int low,int high) 

nums[high]=nums[low];

}nums[low]=pivotkey;

return low;//樞軸記錄到位

}public int findkthlargest(int nums, int k)

}

方法二: 

class solution 

}int partition(vector& nums, int left, int right)

if (nums[l] >= pivot) ++l;

if (nums[r] <= pivot) --r;

}swap(nums[left], nums[r]);

return r;}};

LeetCode 215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...

Leetcode215 陣列中的第K個最大元素

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...

LeetCode 215 陣列中的第K個最大元素

在未排序的陣列中找到第k個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4說明 你可以假設 k 總是有效的,且 1 k 陣...