1. 程式人生 > 其它 >leetcode215.陣列中的第K個最大元素

leetcode215.陣列中的第K個最大元素

leetcode215.陣列中的第K個最大元素

題目

給定整數陣列 nums 和整數 k,請返回陣列中第 **k** 個最大的元素。

請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

用例

輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4

求解

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    let res = 0
    // 先排序後查詢
    // nums.sort((a,b)=>{
    //     return b-a
    // })
    // return nums[k-1]
    //快速排序,找右側第k個位置
    quicksort(0,nums.length-1,k)
    return res

    function quicksort(i,j,k){
        if(i>j||j<nums.length-k){
            return
        }
        if(k<=0){
            return
        }

        let origin_i=i
        let origin_j=j
        let tmp = nums[i]
        while(i<j){
            //右邊指標向左移動,直到遇到小於tmp的,然後將其復值到i的位置
            while(i<j){
                if(nums[j]>=tmp){
                    j--
                }else{
                    nums[i]=nums[j]
                    break
                }
            }
            //左邊指標向右移動,直到遇到大於tmp的,然後將其賦值到j的位置
            while(i<j){
                if(nums[i]<=tmp){
                    i++
                }else{
                    nums[j]=nums[i]
                    break
                }
            }
        }
        //i的位置就是tmp的位置
        nums[i]=tmp
        //如果i剛好時當前陣列中倒數第k個
        if(i==nums.length-k){
            //那麼他就是要求的值
            res = tmp
            return
        }
        //遞迴呼叫左右兩邊
        quicksort(origin_i,i-1,k)
        quicksort(i+1,origin_j,k)
    }
};