LeetCode Kth Largest Element in an Array

twisted-fate發表於2019-05-21

分割槽的操作和快排一模一樣

這裡的虛擬碼實際找的是第k-1小的數 , 因此在這裡做了轉換

第k大的數 = 第len-k+1小的數 len=end+1

然後實際是找第k-1索引處的數 , 因此為end+1-k+1-1
(其實這裡的定義有點混亂了 , 不管怎樣第一次Accepted了 , 之後再改進 )

LeetCode Kth Largest Element in an Array

func partition(nums []int, start int, end int) int {
    p := start
    j := start + 1
    i := start

    v := nums[p]

    for j <= end {
        if nums[j] < v {
            tmp1 := nums[j]
            nums[j] = nums[i+1]
            nums[i+1] = tmp1

            i++
            j++
        } else if nums[j] >= v {
            j++
        }
    }

    tmp2:=nums[i]
    nums[i]=nums[p]
    nums[p]=tmp2

    p=i
    return p
}

func findKthLargest(nums []int, k int) int {

    start:=0
    end:=len(nums)-1

    //實際找的是第k-1小的數 , 因此在這裡做了轉換
    //第k大的數 = 第len-k+1小的數  len=end+1
    //然後實際是找第k-1索引處的數 , 因此為end+1-k+1-1
    return findKthLargestIn(nums,start,end,end+1-k+1-1)

}

func findKthLargestIn(nums []int, start int, end int, n int) int{
    k:=partition(nums,start,end)

    if k==n {
        return nums[k]
    }
    if k<n {
        return findKthLargestIn(nums,k+1,end,n)
    }
    if k>n {
        return findKthLargestIn(nums,start,k-1,n)
    }
    return 0
}

相關文章