LintCode刷题之路(五):第K大元素

  1. 第k大元素
    在数组中找到第k大的元素
    样例
    给出数组 [9,3,2,4,8],第三大的元素是 4
    给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推
    挑战
    要求时间复杂度为O(n),空间复杂度为O(1)

思路:
在每一趟中,都会将一个数放入序列的指定位置,放入后,数组被分为两个独立的部分;该数的左边都是大于它的数,右边都是小于它的数。通过迭代,将整个数组从大到小排列。
利用快排的思想,如果在某一趟结束后,前面一部分的数为k-1个,该数为第k个(下标为k-1)

C++:
补充:vector &nums :vector是C++中的一个容器,可以动态的存放各种类型的数组。此处类比 int &a来思考这个定义。

class Solution {
public:
    /*
     * @param n: An integer
     * @param nums: An array
     * @return: the Kth largest element
     */
    int kthLargestElement(int n, vector<int> &nums) {
        // write your code here
        return quickSort(nums,0,nums.size()-1,n);

    }

    int quickSort(vector<int> &nums,int left,int right,int n)
    {
        int i = left;
        int j = right;
        int temp = nums[i];

        while(i<j)
        {
            while(i<j&&temp>=nums[j])
            {
                j--;
            }
            if(i<j)
            {
                nums[i] = nums[j];
                i++;
            }

            while(i<j&&temp<=nums[i])
            {
                i++;
            }
            if(i<j)
            {
                nums[j] = nums[i];
                j--;
            }
        }

        if(i==n-1)
        {
            return temp;
        }
        else if(i>n-1)
        {
            return quickSort(nums,left,i-1,n);
        }
        else
        {
            return quickSort(nums,i+1,right,n);
        }
    }
};

Py3:

class Solution:
    # @param k & A a integer and an array
    # @return ans a integer
    def kthLargestElement(self, k, A):
        return self.quickSort(A,0,len(A)-1,k)

    def quickSort(self,nums,left,right,k):
        i = left 
        j = right
        tmp = nums[i]

        while i<j:
            while i<j and tmp>=nums[j]:
                j -= 1
            if i<j:
                nums[i] = nums[j]
                i += 1

            while i<j and tmp<=nums[i]:
                i += 1
            if i<j:
                nums[j] = nums[i]
                j -= 1
        if i==k-1:
            return tmp
        elif i<k-1:
            return self.quickSort(nums,i+1,right,k)
        else:
            return self.quickSort(nums,left,i-1,k)

猜你喜欢

转载自blog.csdn.net/qq_38213612/article/details/80274903