码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode 215. Kth Largest Element in an Array 寻找第k个大的数---------- java

时间:2017-03-30 17:54:25      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:ret   sum   use   turn   discuss   维护   tar   else   tin   

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大的数。

 

1、建立一个大小为k的数组,每次维护这个数组,属于暴力做法。

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        int len = nums.length;
        int[] result = new int[k];
        for (int i = 0; i < k ; i++){
            result[i] = nums[i];
        }
        for (int i = k; i < len; i++){
            int min = result[0];
            int pos = 0;
            for (int j = 1; j < k; j++){
                if (min > result[j]){
                    min = result[j];
                    pos = j;
                }
            }
            if (nums[i] > min){
                result[pos] = nums[i];
            }
        }
        int ans = result[0];
        for (int i = 1; i < k; i++){
            System.out.println(result[i] + " " + result[0]);
            ans = Math.min(ans, result[i]);
        }
        return ans;
    }
}

2、利用快排

 

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        return QuickSort(nums, k, 0, nums.length - 1);
    }
    
    public int QuickSort(int[] nums, int k, int start, int end){
        int left = start, right = end;
        int num = nums[start];
        for (int i = end; i > start; i--){
            if (nums[i] >= num){
                swap(nums, end--, i);
            }
        }
        swap(nums, end, start);
        if (k == nums.length - end){
            return nums[end];
        } else if (k > nums.length - end){
            return QuickSort(nums, k, left, end - 1);
        } else {
            return QuickSort(nums, k, end + 1, right);
        }
    }
    public void swap(int[] nums, int a, int b){
        int num = nums[a];
        nums[a] = nums[b];
        nums[b] = num;
    }
}

 

 

3、discuss中的快排。速度更快

public class Solution {
    
    public int findKthLargest(int[] nums, int k) {

        return select(nums, k-1);
    }
    
    // Quick select
    private int select(int[] nums, int k) {
        int left = 0, right = nums.length-1;
        while(true) {
            if(left == right)
                return nums[left];
            int pivotIndex = medianOf3(nums, left, right);
            pivotIndex = partition(nums, left, right, pivotIndex);
            if(pivotIndex == k)
                return nums[k];
            else if(pivotIndex > k)
                right = pivotIndex-1;
            else
                left = pivotIndex+1;
        }
    }
    
    //Use median-of-three strategy to choose pivot
    private int medianOf3(int[] nums, int left, int right) {
        int mid = left + (right - left) / 2;
        if(nums[right] > nums[left])
            swap(nums, left, right);
        if(nums[right] > nums[mid])
            swap(nums, right, mid);
        if(nums[mid] > nums[left])
            swap(nums,left, mid);
        return mid;
    }
    
    private int partition(int[] nums, int left, int right, int pivotIndex) {
        int pivotValue = nums[pivotIndex];
        swap(nums, pivotIndex, right);
        int index = left;
        for(int i = left; i < right; ++i) {
            if(nums[i] > pivotValue) {
                swap(nums, index, i);
                ++index;
            }
        }
        swap(nums, right, index);
        return index;
    }
    
    private void swap(int[] nums, int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }

}

 

leetcode 215. Kth Largest Element in an Array 寻找第k个大的数---------- java

标签:ret   sum   use   turn   discuss   维护   tar   else   tin   

原文地址:http://www.cnblogs.com/xiaoba1203/p/6646134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!