代码之家  ›  专栏  ›  技术社区  ›  QuantumCookie

使用数字DP和二进制搜索查找具有特定属性的第K个数

  •  1
  • QuantumCookie  · 技术社区  · 7 年前

    求第K个数,其位数之和等于60。

    数字动态规划

    我试过的

    我写了一个计数函数 F(N) 使用数字DP,给定数字N,计算范围内的所有数字 [1, N] 位数和等于 60 X < Y 然后 F(X) <= F(Y) . 我用这个观察结果编写了一个二进制搜索方法,它计算两个值,即下限和上限。

    Lower Bound: the last number for which F(N) < K

    Upper Bound: the last number for which F(N) <= K

    然后我从下限迭代到上限以找到答案。

    我的问题

    • 如果没有,我们如何解决这个问题?
    • 如果是,有更好的方法吗?
    1 回复  |  直到 7 年前
        1
  •  0
  •   monster    7 年前

    如果只需要使用数字dp和二进制搜索,那么答案的起点似乎是正确的。但我不明白 upperbound lowerbound 用于或甚至是必需的。

    下面是在生成函数后我将如何做这个问题 F()

    binary_search(int start,int end,int k){
        int mid=(start+end)/2;
    
        //mid is answer only if F(mid) has exactly k numbers and F(mid-1) has k-1 numbers
        if(F(mid)==k&&F(mid-1)==k-1) return mid;
    
        //if F(mid) has less than k numbers we need to check for greater numbers for answer
        else if(F(mid)<k) return binary_search(mid+1,end,k);
    
        //finally if F(mid) has more than or equal to k numbers we check smaller numbers for answer
        else return binary_search(start,mid-1,k);
    }
    

    (琐碎的建议)当你做函数时 F(N) 您应该使其能够计算和存储 F(x) x 属于范围 [1,N] .