1普通的算法题
需要考虑数组长度为0的情况 所以a[0]这种觉得一定没问题的变量其实存在很多的问题的
101010这种二元选择问题其实都可以看成是树
递归通常是解决该类问题的好方法
我遇到一个问题
是路径选择问题 只能往又往下走 往右必须走n步 往下必须走m步
然后到达(n,m)坐标
因为只有两种走向 所以往左和往下分别 可以分别设为 0 1
这样如果需要得出全部路径 最容易想到的方法是递归
因为就像走n+m步 每步两种选择 这样看就像二叉树 不过是加了一些限制(往右必须走n布 往下必须走m步)
之后我想用for循环实现 for(;<m+n;)
然后在for循环内加判断实现限制(往右必须走n布 往下必须走m步)
但是这样的for循环如何实现类似的2^n可能性很让人困扰
还是递归靠谱
之后我又想到一个方法
总共 n+m步 就是 n+m位 具体就像 1100011这样
n位1 m位0
这样思考就简单了 n位1会出现在不同的位 这时候 1代表的可能 是 1 2 4 8 ...
然后从其中取出不重复 n个值 然后想加 就得到一个数 这个数换成2进制 就像 1100011这样
然后一次就可以推出路径了
此路不通
还有一种方法也是for循环
因为 n和m的限制, 其实就是一种排列组合 1001 1100 这样4位里面 2^3中个数 有2个1的组合
用for循环遍历 2^3个数 找到其中二进制有且刚好有两个1的
这个有很多方法 1.移位
2.x=x&(x-1)
int count = 0; while(x) { count ++; x = x&(x-1); } return count;
....