LeetCode338比特位计数

比特位计数>>>
在这里插入图片描述

dp[i]为当前数的比特位数,若i为奇数则dp[i]=dp[i-1]+1,若i为偶数dp[i]=dp[i/2]

package BDyNamicProgramming;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/22 0022  17:59
 * 给定一个非负整数 num。对于 0 ≤ i ≤ num
 * 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。


 */
public class Problem338 {

    /**
     *
     * @param num
     * @return
     *
     */
    public int[] countBits(int num) {
        int[] dp = new int[num+1];

        if(num==0){
            return dp;
        }
        dp[0]=0;
        dp[1]=1;
        for(int i=2;i<num+1;i++){
            dp[i]=dp[i&(i-1)]+1;
        }

        return dp;

    }


    /**
     *
     * @param num
     * @return
     * 对于所有数字只要两类:
     *   奇数:二进制表示,奇数一定比前面的那个偶数多一个1,因为多的就是最低位的1
     *
     *   偶数:二进制表示中,偶数中1的个数和除以2之后的那个树一样多,因为最低位是0
     *   出以2就是右移1位,也就是把那个0抹掉而已,所以1的个数是不变的
     *
     */
    public int[] countBits1(int num){
        int[] dp = new int[num+1];

        if(num==0){
            return dp;
        }
        dp[0]=0;
        dp[1]=1;
        for(int i=2;i<num+1;i++){
          if(i%2==0){//偶数
              dp[i]=dp[i/2];
          }else{//奇数比前面的偶数多1,因为多的就是最低位的1
              dp[i]=dp[i-1]+1;
          }
        }

        return dp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值