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;
}
}