215. 数组中的第K个最大元素

题目

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array

给定整数数组 nums 和整数 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

答案1(sort)

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    let ansarray=nums.sort((a,b)=>b-a); 
    return ansarray[k-1];
};

答案2(快排)

1、完整快排

var findKthLargest = function (nums, k) {
    let left = 0, right = nums.length - 1;
    let key = nums.length - k;
    QuickSort(nums, left, right);
    return nums[k - 1];
};

function QuickSort(array, left, right) {
    let pivot = partition(array, left, right);
    if (left < right) {
        QuickSort(array, left, pivot - 1);
        QuickSort(array, pivot + 1, right);
    }
}

function partition(array, left, right) {
    let index = array[left];
    while (left < right) {
        if (left < right && array[right] <= index) {
            right--;
        }
        array[left] = array[right];
        if (left < right && array[left] >= index) {
            left++;
        }
        array[right] = array[left];
    }
    array[left] = index;
    return left;
}

2、部分快排

var findKthLargest = function (nums, k) {
    let left = 0, right = nums.length - 1;
    QuickSort(nums, left, right, k - 1);
    return nums[k - 1];
};

function QuickSort(array, left, right, key) {
    let pivot = partition(array, left, right);
    if (pivot == key) {
    } else if (pivot < key) {
        QuickSort(array, pivot + 1, right, key);
    } else {
        QuickSort(array, left, pivot - 1, key);
    }
}

function partition(array, left, right) {
    let index = array[left];
    while (left < right) {
        if (left < right && array[right] <= index) {
            right--;
        }
        array[left] = array[right];
        if (left < right && array[left] >= index) {
            left++;
        }
        array[right] = array[left];
    }
    array[left] = index;
    return left;
}

答案3(堆排序)

作者:gang-feng
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/xie-gei-qian-duan-tong-xue-de-ti-jie-yi-kt5p2/
来源:力扣(LeetCode)

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
 // 整个流程就是上浮下沉
var findKthLargest = function(nums, k) {
   let heapSize=nums.length
    buildMaxHeap(nums,heapSize) // 构建好了一个大顶堆
    // 进行下沉 大顶堆是最大元素下沉到末尾
    for(let i=nums.length-1;i>=nums.length-k+1;i--){
        swap(nums,0,i)
        --heapSize // 下沉后的元素不参与到大顶堆的调整
        // 重新调整大顶堆
         maxHeapify(nums, 0, heapSize);
    }
    return nums[0]
   // 自下而上构建一颗大顶堆
   function buildMaxHeap(nums,heapSize){
     for(let i=Math.floor(heapSize/2)-1;i>=0;i--){
        maxHeapify(nums,i,heapSize)
     }
   }
   // 从左向右,自上而下的调整节点
   function maxHeapify(nums,i,heapSize){
       let l=i*2+1
       let r=i*2+2
       let largest=i
       if(l < heapSize && nums[l] > nums[largest]){
           largest=l
       }
       if(r < heapSize && nums[r] > nums[largest]){
           largest=r
       }
       if(largest!==i){
           swap(nums,i,largest) // 进行节点调整
           // 继续调整下面的非叶子节点
           maxHeapify(nums,largest,heapSize)
       }
   }
   function swap(a,  i,  j){
        let temp = a[i];
        a[i] = a[j];
        a[j] = temp;
   }
};

上一篇:cmake:unset


下一篇:shell编程—变量(三)