LeetCode 215 —— Kth Largest Element in an Array

这道题也没有很多特别的地方,就是去找数组中第k大的数。最简单的就是直接去给数组排个序然后找到倒数第k个数字,这样虽然简单粗暴,但是当数组很大的时候,这样做就很浪费了,所以肯定要稍微优化一下。

这里使用的算法就是quickSelect,借用快排quickSort的思想,每次都找一个pivot元素,然后将比pivot小的数都放到pivot左边,大的都放到右边。放完之后看看比pivot大的数有几个,并且和k进行比较,计算一下具体的数字大概就是:

if(high-pivot+1 == k)
	return nums[pivot];
else if(high-pivot+1 > k)
	return quickSelect(nums, pivot+1, high, k);
else
    return quickSelect(nums, low, pivot-1, k-high+pivot-1);

然后就是放置元素操作了, 可能有些地方会容易出错,这个细心点写就好了,全部代码如下:

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        return quickSelect(nums, 0, nums.size() - 1, k);
    }

    int quickSelect(vector<int>& nums, int low, int high, int k){
        int pivot = low;
        int pivot_val = nums[pivot];
        int i = low, j = high;
        int flag = 1;
        while(i < j){
            while(nums[j] >= pivot_val && i < j){
                j--;
            }
            // 交换nums[i]和nums[j]
            if(nums[j] < pivot_val && i < j){
                nums[i] = nums[j];
                i++; // 填坑后移
            }

            // i向后搜索,找到第一个大于key的值
            while(nums[i] <= pivot_val && i < j){
                i++;
            }
            // 交换nums[i]和nums[j]
            if(nums[i] > pivot_val && i < j){
                nums[j] = nums[i];
                j--;
            }
        }
        if(i == j){
            nums[i] = pivot_val;
            pivot = i;
        }
        if(high-pivot+1 == k)
            return nums[pivot];
        else if(high-pivot+1 > k)
            return quickSelect(nums, pivot+1, high, k);
        else
            return quickSelect(nums, low, pivot-1, k-high+pivot-1);

    }
    
};

你可能感兴趣的:(leetcode)