关于最小k个数的问题

关于最小k个数的问题

下面是我的代码:

func smallestK(arr []int, k int) []int {
    if len(arr)==0||k==0{
        return make([]int,0)
    }
    return smallestK2(arr,0,len(arr)-1,k)
}
func smallestK2(arr []int,l int,r int ,k int) []int {
    // //解题思想:三路快排
    if l >= r {
        return make([]int,0)
    }
    p :=partition(arr,l,r)
    if p-1 == k{
        return arr[0:p-1]
    }else if p-1 < k{
        return  smallestK2(arr,p+1,r,k)
    }else {
        return smallestK2(arr,l,p-1,k)
    }
}
func partition(arr []int,l int ,r int)int{
    var p int = rand.Intn(r-l+1) + l
    arr[l], arr[p] = arr[p], arr[l]
    //arr[l+1...i-1]<=v;arr[j+1...r]>=v
    i := l + 1
    j := r
    for {
        for i <= j && arr[i] < arr[l] {
            i++
        }
        for j >= i && arr[j] > arr[l] {
            j--
        }
        if i >= j {
            break
        }
        arr[i], arr[j] = arr[j], arr[i]
        i++
        j--
    }
    arr[l], arr[j] = arr[j], arr[l]
    return j
}

实在是看不出来我那个地方有问题,在leetcode中运行截图如下:

http://img1.sycdn.imooc.com//climg/601634330909ca2810140955.jpg


输出一直显示为空,这个测试数据貌似也并不符合我设置为空的情况,然后我尝试将这个测试案例复制到我本机环境中尝试,结果发现运行没有问题:

http://img1.sycdn.imooc.com//climg/601634c3093a1b5a18980786.jpg

是我那个点没有注意到吗,如果是代码有问题的话,为什么在本地可以呢?希望bobo老师解答一下谢谢?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

题号是???


==========


我修改成如下可以通过:


func smallestK(arr []int, k int) []int {
    if len(arr)==0||k==0{
        return make([]int,0)
    }
    return smallestK2(arr,0,len(arr)-1,k - 1)
}

func smallestK2(arr []int,l int,r int ,k int) []int {
    // //解题思想:三路快排
    if l >= r {
        // 核心问题在这里
        return arr[0:l+1]
    }
    
    p :=partition(arr,l,r)
    if p == k{
        return arr[0:p+1]
    }else if p < k{
        return  smallestK2(arr,p+1,r,k)
    }else {
        return smallestK2(arr,l,p-1,k)
    }
}
func partition(arr []int,l int ,r int)int{
    var p int = rand.Intn(r-l+1) + l
    arr[l], arr[p] = arr[p], arr[l]
    //arr[l+1...i-1]<=v;arr[j+1...r]>=v
    i := l + 1
    j := r
    for {
        for i <= j && arr[i] < arr[l] {
            i++
        }
        for j >= i && arr[j] > arr[l] {
            j--
        }
        if i >= j {
            break
        }
        arr[i], arr[j] = arr[j], arr[i]
        i++
        j--
    }
    arr[l], arr[j] = arr[j], arr[l]
    return j
}


核心是 l >= r 的时候不是没有找到。因为 l == r 依然是一个合法的搜索空间,此时的 l 和 r 应该就是要找的索引 k - 1.


P.S. 因为我不习惯传入的 k 不是索引,所以代码中我把 k 的偏移在初始的时候处理了,初始传入的是 k - 1(和课程中的逻辑一样)。这一点你可已根据你的逻辑再调整。


继续加油!:)

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2633    人
  • 解答问题       1105    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师