Golang算法-动态规划(lc338.比特位计数)

动态规划

Lc338.比特位计数

https://leetcode-cn.com/problems/counting-bits/

1、确定dp数组的含义
dp[i]:整数i的二进制为1的个数
2、确定dp的递归函数
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
6 --> 110
7 --> 111
可以看出
if i % 2 == 0,dp[i] = dp[i/2]
if i % 2 == 1,dp[i] = dp[i/2] =1 
由此引入位运算符>>,<<及&
"a >> b":将a所有二进制数向右移动b位数,同理可知<<
"a & b":参与运算的两数各对应的二进位相与,相同则为1.否则为0
3、确定初始条件
dp[0] = 0

代码:

func countBits(n int) []int {
    //确定dp数组
    dp := make([]int,n+1)
    for i := 1; i <= n; i++ {
      	//递归函数
        dp[i] = dp[i>>1] + i&1
    }
    return dp
}

总结:

动态规划“三步走”

1、确定dp数组的状态

2、确定dp递归函数

3、确定dp初始条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值