LintCode——第K大元素
第K大元素:在数组num中找到第k大的元素(可以交换数组中的元素的位置)
样例:
数组 [9,3,2,4,8]
,第三大的元素是 4
数组 [1,2,3,4,5]
,第一大的元素是 5
,第二大的元素是 4
,第三大的元素是 3
解题思路:
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分
数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
利用快速排序思想找到第K大元素。
1、Java:
1 class Solution { 2 /* 3 * @param k : description of k 4 * @param nums : array of nums 5 * @return: description of return 6 */ 7 public int kthLargestElement(int k, int[] nums) { 8 // write your code here 9 return quickSort(nums,0,nums.length-1,k); 10 } 11 public int quickSort(int[] nums,int left,int right,int k){ 12 int i = left; 13 int j = right; 14 int tmp = nums[i]; 15 while(i<j){ 16 while(i<j && tmp>=nums[j]) j--; 17 if(i<j){ 18 nums[i]=nums[j]; 19 i++; 20 } 21 while(i<j && tmp<nums[i]) i++; 22 if(i<j){ 23 nums[j]=nums[i]; 24 j--; 25 } 26 } 27 if(i == k -1){ 28 return tmp; 29 }else if(i< k-1){ 30 return quickSort(nums,i+1,right,k); 31 }else{ 32 return quickSort(nums,left,i-1,k); 33 } 34 } 35 };
2、Python:
1 class Solution: 2 # @param k & A a integer and an array 3 # @return ans a integer 4 def kthLargestElement(self, k, A): 5 return self.quickSort(A,0,len(A)-1,k) 6 7 def quickSort(self,nums,left,right,k): 8 i = left 9 j = right 10 tmp = nums[i] 11 while i<j: 12 while i<j and tmp>=nums[j]: 13 j -= 1 14 if i<j: 15 nums[i] = nums[j] 16 i += 1 17 while i<j and tmp< nums[i]: 18 i += 1 19 if i<j: 20 nums[j] = nums[i] 21 j -= 1 22 if i == k-1: 23 return tmp 24 elif i< k-1: 25 return self.quickSort(nums,i+1,right,k) 26 else: 27 return self.quickSort(nums,left,i-1,k)