Javascript in LeetCode让前端飞

leetCode (js):215. 数组中的第K个最大元素

2018-12-05  本文已影响2人  i7eo

在未排序的数组中找到第 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] 和 k = 1
输出: 1

(假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度)

var findKthLargest = function(nums, k) {
    return quickSort(nums, k-1, 0, nums.length - 1);    
};

let quickSort = (arr, k, l, h) => {
    let low = l,
        high = h,
        pivot;

    if(h === 0) return arr[k]; // [1],1 => 1

    pivot = partition(arr, low, high);

    if(k>pivot){
      if(k==arr.length || (pivot + 1) == high) {
        return arr[k];
      }else{
        return quickSort(arr, k, pivot+1, high);
      }
    }
    if(k === pivot) return arr[k];
    if(k<pivot) return quickSort(arr, k,low,pivot-1);
};

let partition = (arr, low, high) => {
    for(let j = low; j <= high; j++) {
      if(arr[j] > arr[high]) {
        swap(arr, low, j);
        low++;
      }
    }
    swap(arr, low, high);
    return low;
};

let swap = (arr, low, high) => {
    let tmp = arr[low];
    arr[low] = arr[high];
    arr[high] = tmp;
};

利用快排分区的思想,这里if(arr[j] > arr[high])用排列出倒序数组后再去拿返回的low(pivot) 与 k-1 判断大小,若小于则在左侧,若大于则在右侧。
      其实还有更加简便的方法,如下:

var findKthLargest = function(nums, k) {
    return nums.sort((a, b) => b - a)[k-1];    
};

这样也是可以的,但是sort函数的具体实现原理我们就忽略掉了。其实V8引擎中实现sort函数的时候用到了插入排序和快排,当元素个数小于等于10的时候使用插入排序For short (length <= 10) arrays, insertion sort is used for efficiency.
源码地址:v8_Array.js

上一篇下一篇

猜你喜欢

热点阅读