【问题标题】:Find list of all decreasing sequences of length k?查找所有长度为 k 的递减序列的列表?
【发布时间】:2014-11-05 19:51:07
【问题描述】:

我试图弄清楚如何编写一个函数,该函数接受两个整数 n 和 k,并找到从 0 到 n 的所有长度为 k 的整数的严格递减序列。

例如,allDecreasing(5, 3) 返回

[[4,3,2], [4,3,1], [4,3,0], [4,2,1], [4,2,0], [4,1,0 ], [3,2,1], [3,2,0], [3,1,0], [2,1,0]]

到目前为止,我只有:

function all-decreasing(n, k) {
    if (n > k-1) {
        all-decreasing(n-1, k);
    }
}

这并不多,因为我不太确定如何处理迭代部分。排列和子集算法一直让我感到困惑。如果有人能给我一个关于如何开始的想法,将不胜感激!谢谢。

【问题讨论】:

  • 从范围中选择n个整数,排序。要对每个这样的集合只选择一次,有多种实现方式,例如参见here

标签: javascript algorithm subset


【解决方案1】:

德尔福版。我希望你能看到逻辑

procedure alldecreasing(n, k: Integer; s: string);
var
  i: Integer;
begin
  if k = 0 then
    Output(s)
  else
    for i := n - 1 downto k - 1 do
      alldecreasing(i, k - 1, s + IntToStr(i));
end;

a call:
  alldecreasing(5, 3, '');
gives:
432
431
430
421
420
410
321
320
310
210

【讨论】:

    【解决方案2】:

    你应该像这样考虑问题

    问题 (5 3) - 5 个数字,3 对,2 错

    4 3 2 1 0
    --------- 
    1 1 1 0 0 = 4 3 2 (flip)
    1 1 0 1 0 = 4 3 1 (flip)
    1 1 0 0 1 = 4 3 0 (flip)(reset 1)
    1 0 1 1 0 = 4 2 1 (flip)
    1 0 1 0 1 = 4 2 0 (flip)
    1 0 0 1 1 = 4 1 0 (flip)(reset 2)
    0 1 1 1 0 = 3 2 1 (flip)
    0 1 1 0 1 = 3 2 0 (flip)
    0 1 0 1 1 = 3 1 0 (flip)
    0 0 1 1 1 = 2 1 0 (flip)
    

    你需要能够做的基本操作是:

    • 找到最右边(1 0),翻转(1 0)又名(翻转)
    • 如果不是最右边的 1,则在它之后重置 1,即 (reset n)

    这对于非常大的集合非常有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      相关资源
      最近更新 更多