算法日常

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;


....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值