338.比特位计数
这道题要求O(n)时间一趟遍历解决,空间复杂度在O(n),返回值的空间为O(n) 因此不能使用额外的空间。
要记录0到num每一个数字二进制中1的数目,又要求O(n)时间,也就是说已经“走过”的不能再走,很自然的可以想到奇数的二进制中1的数目是它前一个数的1的数目的多一个,那么偶数呢?在纸上写几个二进制数,写到1100就可以发现规律了
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ans (num+1);
for (int i = 0; i < num+1; ++i) {
if (i&1){ //odd
ans[i]=ans[i-1]+1;
} else{
ans[i]=ans[i/2];
}
}
return ans;
}
};
3月貌似是动态规划月,就这三天的题来看,动态规划应该和递推有关。。。希望3月结束能学到什么是动态规划