力扣日记剑指 Offer II 003

news2024/9/25 15:23:23

1. 题目

LeetCode 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

1.1 题意

计算 0 到 n 之间的每个数的二进制表示中 1 的个数

1.2 分析

看时间复杂度,O(32n)应该能过(也就是每个数一位一位去数1的个数),知道low-bit这个运算x & (x-1) 的话时间复杂度肯定低于O(32n),具体复杂度参考题解是O(nlogn)。

0 <= n <= 10e5

但是查看底下数据范围的时候,有一个进阶提示,可以使用O(n),好家伙一下子来了兴致。
于是我列出了几行找规律。
在这里插入图片描述
发现规律了嘛?每一行,把他从中间对半分成两份,前面一份,刚巧是上一行的结果,后面一份是前面一份的结果+1。

        2^0: 1
        2^1: 1 | 2
        2^2: 1 2 | 2 3
        2^3: 1 2 2 3 | 2 3 3 4
        ......

why? 因为下一行的前半份最高位为1,次高位为0,上一行中对应的最高位为0,次高位为1,所以他们1的个数会相同;对于下一行中后半份,最高位和次高位都为1,所以后半分是前半份的结果+1。

举个例子可能更能明白(另一个情况同理举例即可,主要是帮助理解):

    			2^2: 1 2 2 3
	   对应的10进制: 4 5 6 7
        		2^3: 1 2  2  3  2  3  3  4
	   对应的10进制: 8 9 10 11 12 13 14 15
	   举例4,5和8,9:
	   		4,5对应的二进制为0100 0101
	   		8,9对应的二进制为1000 1001
	   =>下一行的前半份最高位为1,次高位为0,上一行中对应的最高位为0,次高位为1

那接下来写递推式(具体细节可以看代码,主要是清楚这个规律,得到递推):
对于前半段,从上一行抄下来: r e s [ 2 i + j ] = r e s [ 2 ( i − 1 ) + j ] res[2^i+j]=res[2^{(i-1)} + j] res[2i+j]=res[2(i1)+j]
对于后半段,从前半段抄下来并+1: r e s [ 2 i + j + 2 ( i − 1 ) ] = r e s [ 2 i + j ] + 1 res[2^i + j + 2^{(i-1)}]=res[2^i+j]+1 res[2i+j+2(i1)]=res[2i+j]+1

细节上注意边界情况。

1.3 我的解法

class Solution {
public:
    vector<int> countBits(int n) {
        // 0000 0001 0010 0011 0100 0101 0110 0111 1000
        //    0    1    2    3    4    5    6    7    8
        //    0    1    1    2    1    2    2    3    1

        // 2^0: 1
        // 2^1: 1 2
        // 2^2: 1 2 2 3
        // 2^3: 1 2 2 3 2 3 3 4
        // ......
        if(n == 0){
            return {0};
        }
        vector<int> res;
        res.emplace_back(0);
        res.emplace_back(1);

        for(int i=1; i<=( log(n)/log(2) ); i++){
            int num = pow(2,i);
            for(int j=0; j<num/2 && ( (1<<i)+j <= n ); j++){
                // ind: 2^i+j
                // copy from  2^(i-1) + j
                res.emplace_back(res[(1 << (i-1)) + j]);
            }
            for(int j=0; j<num/2 && ( ( (1<<i) + j + (1<<(i-1)) ) ) <= n ; j++){
                // ind: 2^i + j + 2^(i-1)
                // copy from: 2^i+j
                res.emplace_back(res[(1 << i) + j] + 1);
            }
        }
        return res;
    }
};

1.4 学习题解反思

我的解法:
时间复杂度O(n), 原理上遍历每个位置都可以以O(1)时间拿到结果
空间复杂度O(1) ,使用的是常量个中间变量

学习题解:
题解中通过一些一比特的变化做递推,尤其是利用low-bit运算来做的一比特递推还是很有特色的。

2.4 bug日记

居然没出bug

2. 后记

仅分享自己的想法,有意见和指点非常感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/657544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

插入排序代码

时间复杂度O&#xff08;n&#xff09;

开源中文医疗大模型

中文医疗大模型 中文医疗大模型是指通过利用自然语言处理技术和机器学习算法&#xff0c;在大量的医疗文本数据中预训练出来的模型。它可以实现对医疗信息的分类、摘要、问答系统、机器翻译等功能&#xff0c;是医疗行业中的重要工具。在医疗领域中&#xff0c;大规模语言模型&…

答应我,不会回答这五个问题,不要去面试好吗?

1、创建坐席组的功能模块&#xff0c;如何进行测试用例设计&#xff1f; 解答&#xff1a; 功能测试&#xff0c;使用等价类划分法去分析创建坐席的每个输入项的有效及无效类&#xff0c;同步考虑边界值去设计对应的测试用例&#xff1a; 先进行冒烟测试&#xff0c;正常创建…

CSS基础学习--17 布局 - 水平 垂直对齐

一、元素居中对齐 要水平居中对齐一个元素(如 <div>), 可以使用 margin: auto;。设置到元素的宽度将防止它溢出到容器的边缘。元素通过指定宽度&#xff0c;并将两边的空外边距平均分配&#xff1a; <!DOCTYPE html> <html> <head> <meta charset&q…

关于sub-gaussian 和 sub-exponential随机变量的集中不等式

Concentration inequalities under sub-Gaussian and sub-exponential conditions sub-guassian范数和sub-exponential范数&#xff1a; 如果 f k ( X ) f_{k}(X) fk​(X)为sub-gaussian随机变量&#xff0c;则有如下的定理&#xff1a; 应用&#xff1a; 1.向量值集中 2.…

Apache Doris 冷热分层技术如何实现存储成本降低 70%?|新版本特性

在数据分析的实际场景中&#xff0c;冷热数据往往面临着不同的查询频次及响应速度要求。例如在电商订单场景中&#xff0c;用户经常访问近 6 个月的订单&#xff0c;时间较久远的订单访问次数非常少&#xff1b;在行为分析场景中&#xff0c;需支持近期流量数据的高频查询且时效…

mysql索引优化系列(一)

一、不常见的索引失效场景 1、举例 还是之前的member会员记录表&#xff0c;往里面插入十万条数据 drop procedure if exists insert_emp; CREATE PROCEDURE insert_emp () BEGINDECLAREi INT;SET i 1;WHILE( i < 100000 ) DOINSERT INTO member ( NAME, age, address, …

【LeetCode热题100】打卡第24天:单词搜索

文章目录 单词搜索⛅前言&#x1f512;题目&#x1f511;题解 单词搜索 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数…

使用花生壳进行内网穿透实验SQLServer

使用的是体验版&#xff0c;进行实验足够了 &#xff08;1&#xff09;输入花生壳帐号密码登录花生壳管理平台&#xff0c;在【内网穿透】界面点击添加映射&#xff1b; &#xff08;2&#xff09;接着需要填写映射ERP服务器的相关内容&#xff1a;①应用类型&#xff1a;ERP系…

【论文系列解读】StableDiff总结

1. diffusion (0) 总结 可以参考此处&#xff1a;https://blog.csdn.net/weixin_40920183/article/details/130652651 https://zhuanlan.zhihu.com/p/599887666 总的来说&#xff0c;diffusion就是分为训练和采样两个阶段。 &#xff08;A&#xff09;训练阶段&#xff1a…

spring boot security快速使用示例

创建spring boot项目 生成脚手架 登录 https://start.spring.io/ 快速创建一个spring boot脚手架的demo&#xff1a; 配置依赖 因为本地依赖的原因&#xff0c;所以更换了spring boot版本为&#xff1a;2.6.11 <parent><groupId>org.springframework.boot<…

GC垃圾回收

GC垃圾回收 了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行、并行、并发、G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收&#xff1f; 程序的运行必然需要申请内存资源&#xff0c;无效的对象资源如果不及时处理就会一直占有内存资源&#xff0c;最终将导致内…

设计模式(二十一):行为型之访问者模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

Debian openssh-server 的安装

在之前安装系统的时候有一个安装 SSH 服务的&#xff0c;结果没点上&#xff0c;导致系统完成后&#xff0c;ssh无法连接上啊&#xff0c;于是要安装sshd 服务。使用命令&#xff1a;apt-get install openssh-server 结果就出现问题了&#xff1a; 网上搜索说是要更新源&#x…

004 maven 插件默认的

Maven – Guide to Configuring Plug-inshttps://maven.apache.org/guides/mini/guide-configuring-plugins.html 默认插件 参数 Apache Maven Compiler Plugin – compiler:compilehttps://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#forceJavacCom…

MATLAB读取OpenFOAM的二进制文件

OpenFOAM的文件格式 上面是OpenFOAM二进制文件的格式&#xff0c;我们可以看出&#xff0c;前面21行都是无关的说明文件&#xff0c;22开始时除了一个括号之外&#xff0c;其它的都是数据。 读取数据 读取数据的思路非常简单&#xff0c;忽略不需要的&#xff0c;读取需要的。…

第七十七天学习记录:高等数学:定积分应用(宋浩板书)

定积分是微积分的一种应用&#xff0c;通过定积分可以求出曲线下面的面积、弧长、质心、转动惯量等一系列物理量。以下是定积分的一些常见应用&#xff1a; 曲线下面的面积&#xff1a;定积分可以用于求曲线下面的面积。举个例子&#xff0c;如果想要求函数f(x) x^2在区间[0,1…

VFC芯片结构及其工作原理

&#xff08;二&#xff09; VFC芯片结构及其工作原理 1&#xff0e;VFC芯片 AD654的结构 AD654芯片是一个单片VFC变换芯片&#xff0c;中心频率为250kHZ。它是由阻抗变换器A、压控振荡器和一个驱动输出级回路构成&#xff0c;其内部结构见图1&#xff0d;15&#xff08;a入压…

VFC式数据采集系统

三、VFC式数据采集系统 &#xff08;一&#xff09;VFC型的A&#xff0f;D变换概述 一般来说在 A&#xff0f;D的变换过程中&#xff0c; CPU要使 S&#xff0f;H、 MPX、 A&#xff0f;D三个芯片之间控制协调好&#xff0c;因此接口电路复杂。而且ADC芯片结构较复杂&#xff0…

车载软件架构 —— 闲聊几句AUTOSAR OS(五)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…