算法刷题--排列组合

1.在XxY的方格中,以左上角格子为起点,右下角格子为终点,每次只能向下走或者向右走,请问一共有多少种不同的走法

给定两个正整数int x,int y,请返回走法数目。保证x+y小于等于12。  C(x+y,x)

(同类型:n颗相同的糖果,分给m个人,每人至少一颗,问有多少种分法。给定nm,请返回方案数,保证n小于等于12,且m小于等于n。

可以当成插隔板问题来看,C(n-1,m-1))


import java.util.*;

public class Robot {
    public int countWays(int x, int y) {
        // write code here
        if (x==1 || y==1){
            return 1;
        }
        return a(x+y-2)/(a(x-1)*a(y-1)) ;
    }
    public int a(int input){
            int res=1;
            for(int i=2;i<=input;i++){
                res *= i; 
            }
            return res;
        }
}

2.卡特兰数相关   C(2n,n)-C(2n,n+1)=1/(n+1)*C(2n,n)

1)假设有n对左右括号,请求出合法的排列有多少个?合法是指每一个括号都可以找到与之配对的括号,比如n=1时,()是合法的,但是)(为不合法。

给定一个整数n,请返回所求的合法排列数。保证结果在int范围内。

2)n个数进出栈的顺序有多少种?假设栈的容量无限大。

给定一个整数n,请返回所求的进出栈顺序个数。保证结果在int范围内。

3)2n个人排队买票,n个人拿5块钱,n个人拿10块钱,票价是5块钱1张,每个人买一张票,售票员手里没有零钱,问有多少种排队方法让售票员可以顺利卖票。给定一个整数n,请返回所求的排队方案个数。保证结果在int范围内。

import java.util.*;

public class Parenthesis {
    public int countLegalWays(int n) {
        // write code here
        int A=1;
        int B=1;
        for(int i = 2;i<=n;i++){
            A *= i ;
        }
        for(int j=n+2;j<=2*n;j++){
            B *= j;
        }
        return B/A;
    }
}
…………
阅读更多
个人分类: 算法刷题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭