帕斯卡三角形中的曲棍球棒图案

时间:2018-06-01 09:48:40

标签: algorithm

我了解了pascal的三角形,并用Java(O2)复杂度打印出一个 现在,对于下一部分,我必须找到形成曲棍球棒图案的数字序列,我被困在这里。任何帮助都会很棒!
同样this link将帮助您了解帕斯卡三角形中曲棍球棒图案的含义。 下面是我写的返回三角形的代码

int[][] printPascal(int n)
{
    int[][] arr= new int[n][n];
    for(int line=0;line<n;line++)
    {
        for(int i=0;i<=line;i++)
        {
            if(line==i|| i==0)
            {
                arr[line][i]=1;
            }
            else
            {
                arr[line][i]=arr[line-1][i-1]+arr[line-1][i];
            }
            System.out.print(arr[line][i]+" ");

        }
        System.out.println();
    }
    return arr;
}

我尝试做某事但我得到的是arrayIndexOutOfBound

void printSequence(int[][]arr)
{
    int n= arr.length;
    Map<Integer, List<Integer>> map =new HashMap<>();
    List<Integer> sequence= new ArrayList<>();

    for(int i=0;i<=n;i++)
    {

        int count=0;
        int res=0;
        for(int line=0;line<n;line++)
        {

            sequence.add(arr[line][i]);
            res=sumList(sequence);

            if(res!=arr[line+1][i+1])
            {
                sequence=new ArrayList<>();
                continue;
            }
            else
            {
                List<Integer> resSeq= new ArrayList<>(sequence);
                resSeq.add(arr[line+1][i+1]);
                map.put(++count, resSeq);
                res=0;
            }
        }
    }
}  

我需要找到满足规则的所有序列 nCr的+(N + 1)的Cr +(N + 2)的Cr + ..... +(N + K)的Cr =(N + K + 1)的Cr
如果在Pascal的三角形上标记这些序列将类似于曲棍球棒。

以下是我的解决方案的样子

  void hockeyNumbers(int[][] arr) {
    int n = arr.length;
    List<Integer> sequence;
    Map<Integer, List<Integer>> map = new HashMap<>();
    int count = 0;
    for (int i = 0; i < n; i++) {


        int res = 0;
        sequence = new ArrayList<>();
        for (int line = i; line < n - 1; line++) {

            sequence.add(arr[line][i]);
            res = sumList(sequence);

            if (res == arr[line + 1][i + 1]) {
                List<Integer> resSeq = new ArrayList<>(sequence);
                resSeq.add(arr[line + 1][i + 1]);
                if (resSeq.size() > 2) {
                    map.put(++count, resSeq);
                }
                res = 0;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,看起来如下所示。我将所有序列存储在一个hashmap中供以后使用。

void hockeyNumbers(int[][] arr) {
int n = arr.length;
List<Integer> sequence;
Map<Integer, List<Integer>> map = new HashMap<>();
int count = 0;
for (int i = 0; i < n; i++) {
    int res = 0;
    sequence = new ArrayList<>();
    for (int line = i; line < n - 1; line++) {

        sequence.add(arr[line][i]);
        res = sumList(sequence);

        if (res == arr[line + 1][i + 1]) {
            List<Integer> resSeq = new ArrayList<>(sequence);
            resSeq.add(arr[line + 1][i + 1]);
            if (resSeq.size() > 2) {
                map.put(++count, resSeq);
            }
            res = 0;
        }
    }
}
}

答案 1 :(得分:0)

我尝试通过具有某些边界条件的帕斯卡三角形找到曲棍球棒。(0

现在,创建Pascal's triangle is using Binomial coefficients的一种方法。

接着,我们可以得到曲棍球棒。为此,我们不需要创建完整的三角形。您只需要曲棍球的行号和长度。 我们知道,曲棍球杆始终以1开头,该行的第二个索引将是行号本身。 因此,现在,我们已经有了曲棍球棒 1和(Row + 1)的两个值。 下一个值可以使用以下项通过二项式系数生成: C(线,i)= C(线,i-1)*(线-i + 1)/ i

 private static void hockeyStick(int row, int length) {
    System.out.println("Hockey stick statring from " + row);
    List<Integer> finalResult = new ArrayList<>(Arrays.asList(1, ++row));
    int oldValue = 1;
    int newValue = row;
    int sum = row + 1;
    for (int i = 2; i < length - 1; i++) {
        finalResult.add(newValuebimialCoefficient(oldValue + newValue, i, ++row));
        oldValue += newValue;
        newValue = finalResult.get(i);
        sum += newValue;
    }
    finalResult.add(sum);
    System.out.println(finalResult);
}

private static int newValuebimialCoefficient(int oldValue, int index, int line) {
    return (oldValue * (line - index + 1) / index);

}

我认为这应该有所帮助。