我最近遇到一个问题,问题的陈述是这样的:
对于给定的L和R,我们需要求出满足L ≤ X ≤ R的二进制表示中只有三个集合位的数X的个数。
预期时间复杂度:O(对数(63^3))
预计辅助空间:O(1)
链接-https://practice.geeksforgeeks.org/problems/akku-and-binary-numbers0902/0/
我已经尝试了这个解决方案,但它显示优化更多,任何建议,我可以如何优化它
long long solve(long long l, long long r){
long long count = 0,ctr=0;
for(long long j=l; j<=r; j++){
count = 0;
for(int i=31; i>=0; i--)
{ if(j & (1<<i))
count++;
if(count>3) break; // If counts more than 3 set bits then break it
}
if(count==3)
ctr++;
}
return ctr;
}
2条答案
按热度按时间rseugnpd1#
代码背后的思想相当简单,我们通过取set位来生成二进制数,在这个问题中已经问了三个set位,所以我们将生成三个变量并运行三个while循环。
例如,要求数字--〉11到19
OR = 0111 --〉7,因此,如果数字在[l,r]范围内,则计数增加。
编码依据--〉https://auth.geeksforgeeks.org/user/628826/practice/
rqqzpn5f2#
要在没有3个循环的情况下解决这个问题,您可以在位计数中找到模式。
示例:
现在请注意,每个新容器(用"-----"括起来)都按顺序包含所有以前的容器,并在它们前面加1。
示例:
使用该观察,我们注意到**"每个精确的x-设置位计数= x-设置位+(x-1)-设置位(前一容器的)"因为当前容器由前一容器+1组成
由于我们只需要找到准确的3-setbits计数,我们可以进一步优化这一点。
注意事项:
1.正好为0-设置位计数为始终为1**
1.对于小于2^n的容器,如果n〉= 1,则1集位计数为n,否则为0(1的和)
1.对于小于2^n的容器,如果n〉= 2,则精确的2-setbit计数为n(n-1)/2,否则为0(n的和)
1.对于小于2^n的容器,如果n〉= 3,则精确的3-setbit计数为n(n-1)(n-2)/6,否则为0(n之和的和)
现在,给定的问题可以分解为:
代码:
复杂性:
此解决方案适用于问题中提供的链接