牛客网算法学习笔记-排列组合

原创 2016年05月31日 12:01:58

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

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

测试样例:
2,2
返回:2
横向要走X-1步,纵向要走Y-1步,总共需要走,X+Y-2步,其中有X-1横向。C{x-1,x+y-2}
class Robot {
public:
    int countWays(int x, int y) {
        // write code here
        if(x==1&&y==1)
            return 0;
        
        return C(x-1,x+y-2);
    }
    
    int C(int m,int n){
        
        long a = n - m ;
        long result = 1;
        long temp1 = 1;
        long  temp2 = 1;
        for(int i = 1 ; i<=n;i++){
            result = result *i;
        }
        
        for(int i = 1;i<=m;i++){
            temp1 = temp1 * i;
        }
        
        for(int i = 1 ; i <=a;i++){
            temp2 = temp2 * i ;
        }
        return result/(temp1*temp2);
        
        
    }
};

n个人站队,他们的编号依次从1到n,要求编号为a的人必须在编号为b的人的左边,但不要求一定相邻,请问共有多少种排法?第二问如果要求a必须在b的左边,并且一定要相邻,请问一共有多少种排法?

给定人数n及两个人的编号ab,请返回一个两个元素的数组,其中两个元素依次为两个问题的答案。保证人数小于等于10。

测试样例:
7,1,2
返回:[2520,720]
第一个:所有的排列组合中一半a在b左边,一半a在b右边
第二个:将两个人看做一个整体,所以一共只有N-1个人的全排列
class StandInLine {
public:
    vector<int> getWays(int n, int a, int b) {
        // write code here
        int result1 = 1;
        for (int i = 1;i<=n;i++){
            result1 = result1 * i;
        }
        int result2 = 1;
        for(int i = 1;i<=n-1;i++){
            result2  = result2 * i;
        }
        vector<int> result;
        result.push_back(result1/2);
        result.push_back(result2);
        return result;
    }
};
9.4(思路比较模糊)

A(A也是他的编号)是一个孤傲的人,在一个n个人(其中编号依次为1到n)的队列中,他于其中的标号为b和标号c的人都有矛盾,所以他不会和他们站在相邻的位置。现在问你满足A的要求的对列有多少种?

给定人数n和三个人的标号A,bc,请返回所求答案,保证人数小于等于11且大于等于3。

测试样例:
6,1,2,3
288
用排除的方式,先将A放在最左边,AB相连的情况,再将A放在最右边,BA相连的情况,然后还有AC,CA。但是这种排列方式中会有A出现在中间的情况,那么就会重复减CAB,和BAC的情况,所以要加回来。
class LonelyA {
public:
    int getWays(int n, int A, int b, int c) {
        // write code here
        if(n==3)
            return 0;
        
        int result = 1;
        int part1 = 1;
        int part2 = 1;
        int minglePart = 1;
        for(int i = 1 ; i<=n;i++){
            result = result * i;
        }
        for(int i = 1;i<=n - 1;i++){
            part1 = part1 * i;
        }
        for(int i = 1;i<=n-1 ; i++){
            part2 = part2 *i;
        }
        for(int i = 1;i<=n-2; i++){
            minglePart = minglePart * i;
        }
        minglePart = minglePart * 2;
        result = result - 2*(part1 + part2) +minglePart;
        return result;
    }
};

n颗相同的糖果,分给m个人,每人至少一颗,问有多少种分法。

给定nm,请返回方案数,保证n小于等于12,且m小于等于n。

测试样例:
10,3
返回:36
class Distribution {
public:
    int getWays(int n, int m) {
        // write code here
        if(n==m)
            return 1;
        return C(n-1,m-1);
    }
    int C(int n ,int m){
        int result =1 ;
        int part1 = 1;
        int part2 = 1;
        for(int i =1 ;i<=n;i++){
            result = result * i;
        }
        
        for(int i =1 ;i<= (n-m);i++){
            part1 = part1 * i;
        }
        for(int i = 1; i<=m;i++){
            part2 = part2 *i;
        }
        return result/(part1*part2);
    }
};

【牛客网】算法编程题汇总

1.优雅数: 小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。 例如:半径的平方如...
  • cChenLiang
  • cChenLiang
  • 2017年05月20日 11:25
  • 955

牛客网刷题笔记

本来想在牛客网上刷完一道在线编程题后就写以下体会笔记,可是找了半天都没找到在哪里写东西,无奈,我就只好来CSDN上写了,只是想写而已,刚开始写,肯定会很不理想,但是没关系,慢慢写吧,总会有提高的。 ...
  • liu_sheng_1991
  • liu_sheng_1991
  • 2016年06月15日 10:40
  • 1018

牛客网算法学习记录-排序

对于一个int数组,请编写一个冒泡排序算法,对数组元素排序。 给定一个int数组A及数组的大小n,请返回排序后的数组。  测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 升...
  • u012656267
  • u012656267
  • 2016年05月18日 15:19
  • 196

跟大家分享一下牛人常用的资源(牛客网 )!

作者:进击的喵 链接:https://www.nowcoder.com/discuss/247?type=5&order=0&pos=2&page=0 来源:牛客网 跟大家分享一下牛人常用的资源类,...
  • qq_36617521
  • qq_36617521
  • 2017年03月20日 09:39
  • 588

C++ 牛客网做题笔记【600题总结】

1:隐藏分为两种:派生类中与基类的函数名相同,参数不同时,无论是否是虚函数,都隐藏;参数相同时,没有虚函数标志,基类函数被隐藏...
  • misayaaaaa
  • misayaaaaa
  • 2017年04月16日 09:19
  • 724

牛客网笔试题

昨天算法今天后端,又水了两把笔试…在这里把待解决的编程题整理一下,端午回来了填坑。三角形个数如图所示,N层对应的三角形个数为?(除了使用递推公式,感觉应该用递归的方法,没时间写了…) ans ...
  • qq_20581563
  • qq_20581563
  • 2016年06月08日 21:35
  • 2731

LeetCode和牛客网的对比

今天参加了校园风暴周的算法岗笔试题,虽然坚持到了最后一秒,但是没有完全答对一道题,说起来真的是惭愧。我在这里就说一说我的感受吧:     我之前基本不在牛客网上练习,一直都是练习LeetCode,突...
  • zr1076311296
  • zr1076311296
  • 2016年06月07日 20:44
  • 4841

牛客网算法学习笔记-智力题

一些智力问题
  • jq117
  • jq117
  • 2017年06月23日 16:58
  • 271

【转载】牛客网Java面试题

什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟 机执行的字...
  • mlstd2012
  • mlstd2012
  • 2016年08月23日 16:24
  • 1193

牛客网面试算法题精讲第二季专题1

package niuke; import java.util.ArrayList; import java.util.Collections; import java.util.Comparato...
  • sunnylinner
  • sunnylinner
  • 2016年09月20日 20:04
  • 502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:牛客网算法学习笔记-排列组合
举报原因:
原因补充:

(最多只允许输入30个字)