LeetCode题练习与总结:不含连续1的非负整数--600

news2025/3/6 21:30:32

一、题目描述

给定一个正整数 n ,请你统计在 [0, n] 范围的非负整数中,有多少个整数的二进制表示中不存在 连续的 1 

示例 1:

输入: n = 5
输出: 5
解释: 
下面列出范围在 [0, 5] 的非负整数与其对应的二进制表示:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
其中,只有整数 3 违反规则(有两个连续的 1 ),其他 5 个满足规则。

示例 2:

输入: n = 1
输出: 2

示例 3:

输入: n = 2
输出: 3

提示:

  • 1 <= n <= 10^9

二、解题思路

这个问题可以通过动态规划(DP)和位操作来解决。以下是解题思路:

  • 动态规划思路

    • 定义 dp[i] 表示长度为 i 的二进制数中,满足条件(没有连续的 1)的数的个数。
    • 考虑长度为 i 的二进制数,它的最高位(第 i 位)可以是 0 或 1。
      • 如果最高位是 0,那么剩下的 i-1 位可以任意排列,所以这种情况下的数目等于 dp[i-1]
      • 如果最高位是 1,那么第二高位(第 i-1 位)必须是 0,剩下的 i-2 位可以任意排列,所以这种情况下的数目等于 dp[i-2]
    • 因此,状态转移方程为:dp[i] = dp[i-1] + dp[i-2],初始条件为 dp[0] = 1 和 dp[1] = 2
  • 位操作思路

    • 对于给定的 n,我们需要统计从 0 到 n 中满足条件的数的个数。
    • 从最高位开始检查,如果当前位和下一位都是 1,则我们需要跳过所有以这两个 1 开头的数,因为它们不满足条件。

三、具体代码

class Solution {
    public int findIntegers(int n) {
        // 初始化dp数组
        int[] dp = new int[32];
        dp[0] = 1;
        dp[1] = 2;
        
        // 填充dp数组
        for (int i = 2; i < 32; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        
        // 从最高位开始检查
        int ans = 0, prev_bit = 0;
        for (int i = 30; i >= 0; i--) {
            // 如果第i位是1
            if ((n & (1 << i)) != 0) {
                // 累加dp[i]
                ans += dp[i];
                // 如果前一位也是1,则停止循环
                if (prev_bit == 1) {
                    break;
                }
                // 更新prev_bit
                prev_bit = 1;
            } else {
                prev_bit = 0;
            }
        }
        
        // 加上0和n本身
        return ans + 1;
    }
}

这段代码首先使用动态规划计算出所有长度小于等于 31 的二进制数中满足条件的数的个数,然后从最高位开始检查给定的 n,使用位操作来确定需要跳过的数的范围,并累加满足条件的数的个数。最后,返回累加的结果加上 0 和 n 本身。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 初始化 dp 数组

    • dp 数组的大小是固定的,为 32(因为题目中提到 n 的最大值为 10^9,在二进制表示中最多有 31 位)。
    • 初始化 dp[0] 和 dp[1] 的操作是常数时间,即 O(1)。
  • 填充 dp 数组

    • 我们有一个循环,它从 2 运行到 31(包含 31),因此循环的次数是固定的,为 30。
    • 每次循环中的操作是常数时间,即 O(1)。
    • 因此,填充 dp 数组的总时间复杂度是 O(1),因为它是固定大小的数组。
  • 检查给定 n 的二进制表示

    • 我们有一个循环,它从 30 运行到 0(包含 0),因此循环的次数是固定的,为 31。
    • 每次循环中的操作(包括位操作和累加操作)都是常数时间,即 O(1)。
    • 因此,检查 n 的二进制表示的总时间复杂度是 O(1)。

综上所述,整个函数的时间复杂度是 O(1),因为所有操作都是常数时间的。

2. 空间复杂度
  • dp 数组

    • dp 数组的大小是固定的,为 32。
    • 因此,dp 数组的空间复杂度是 O(1)。
  • 其他变量

    • ans 和 prev_bit 是单个整数变量,它们的空间复杂度是 O(1)。

综上所述,整个函数的空间复杂度是 O(1),因为所有使用的额外空间都是固定大小的。

五、总结知识点

  • 数组初始化

    • 使用 new int[32] 创建一个固定大小的整型数组 dp,并初始化前两个元素。
  • 动态规划(Dynamic Programming)

    • 使用 dp 数组来存储不同长度的二进制数中满足条件的数的个数。
    • 状态转移方程 dp[i] = dp[i-1] + dp[i-2] 用于填充 dp 数组。
  • 位操作

    • 使用位与操作 & 和左移操作 << 来检查数字 n 的特定位是否为 1。
    • 例如,(n & (1 << i)) != 0 检查第 i 位是否为 1。
  • 循环与条件判断

    • 使用 for 循环来填充 dp 数组。
    • 使用 for 循环从最高位开始检查数字 n 的二进制表示。
    • 使用 if 语句来执行条件判断,并根据条件更新变量。
  • 变量更新

    • 使用变量 ans 来累加满足条件的数的个数。
    • 使用变量 prev_bit 来记录前一位的状态(是否为 1)。
  • 整型运算

    • 在 dp 数组中执行加法运算来计算满足条件的数的个数。
    • 在返回结果时,将 ans 加 1 来包含数字 0 和 n 本身。
  • 递减循环

    • 使用递减的 for 循环从 30 运行到 0,以从最高位开始检查二进制表示。
  • 函数返回值

    • 使用 return 语句返回最终计算的结果。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

AndroidCompose Navigation导航精通1-基本页面导航与ViewPager

文章目录 前言基本页面导航库依赖导航核心部件简单NavHost实现ViewPagerPager切换逻辑图阐述Pager导航实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来…

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

C语言指针专题四 -- 多级指针

目录 1. 多级指针的核心原理 1. 多级指针的定义 2. 内存结构示意图 3. 多级指针的用途 2. 编程实例 实例1&#xff1a;二级指针操作&#xff08;修改一级指针的值&#xff09; 实例2&#xff1a;动态二维数组&#xff08;二级指针&#xff09; 实例3&#xff1a;三级指…

深度学习的应用

目录 一、机器视觉 1.1 应用场景 1.2 常见的计算机视觉任务 1.2.1 图像分类 1.2.2 目标检测 1.2.3 图像分割 二、自然语言处理 三、推荐系统 3.1 常用的推荐系统算法实现方案 四、图像分类实验补充 4.1 CIFAR-100 数据集实验 实验代码 4.2 CIFAR-10 实验代码 深…

RabbitMQ 多种安装模式

文章目录 前言一、Windows 安装 RabbitMq1、版本关系2、Erlang2.1、下载安装 Erlang 23.12.2、配置 Erlang 环境变量 3、RabbitMQ3.1、下载安装 RabbitMQ 3.8.93.2、环境变量3.3、启动RabbitMQ 管理插件3.3、RabbitMQ3.4、注意事项 二、安装docker1、更新系统包&#xff1a;2、…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)

文章目录 引言1. 概述2. 领域驱动设计&#xff08;DDD&#xff09;分层架构模型2.1 DDD的核心概念2.2 DDD架构分层解析 3. 整洁架构&#xff1a;洋葱架构与依赖倒置3.1 整洁架构的核心思想3.2 整洁架构的层次结构 4. 六边形架构&#xff1a;解耦核心业务与外部系统4.1 六边形架…

数据结构与算法之二叉树: LeetCode LCP 10. 二叉树任务调度 (Ts版)

二叉树任务调度 https://leetcode.cn/problems/er-cha-shu-ren-wu-diao-du/description/ 描述 任务调度优化是计算机性能优化的关键任务之一。在任务众多时&#xff0c;不同的调度策略可能会得到不同的总体执行时间&#xff0c;因此寻求一个最优的调度方案是非常有必要的 通…

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…

计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

OpenCV:闭运算

目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…

智云-一个抓取web流量的轻量级蜜罐-k8s快速搭建教程

智云-一个抓取web流量的轻量级蜜罐-k8s快速搭建教程 github地址 https://github.com/xiaoxiaoranxxx/POT-ZHIYUN k8s搭建教程 首先下载代码文件 git clone https://github.com/xiaoxiaoranxxx/POT-ZHIYUN.git cd POT-ZHIYUN编译镜像 代码相关文件在github https://github.com/x…

万物皆有联系:驼鸟和布什

布什&#xff1f;一块布十块钱吗&#xff1f;不是&#xff0c;大家都知道&#xff0c;美国有两个总统&#xff0c;叫老布什和小布什&#xff0c;因为两个布什总统&#xff08;父子俩&#xff09;&#xff0c;大家就这么叫来着&#xff0c;目的是为了好区分。 布什总统的布什&a…

< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机

原因&#xff1a; &#xff1c; OS 有关 &#xff1e; 阿里云&#xff1a;轻量应用服务器 的使用 &#xff1a;从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作&#xff1a; 查看进程&#x…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景&#xff0c;仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…

四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)

四.4 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; zset 有序集合数据类型详解和使用&#xff09; 文章目录 四.4 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; zset 有序集合数据类型详解和使用&#xff09;1. 有序集合 Zset(sorted set)2. zset 有序…

S4 HANA税码科目确定(OB40)

本文主要介绍在S4 HANA OP中税码科目确定(OB40)相关设置。具体请参照如下内容&#xff1a; 税码科目确定(OB40) 在以上界面维护“Transaction Key”的记账码。 在以上界面进一步维护“Transaction Key”确定科目的规则。 Chart of Account:用于明确该规则适用于什么科目表。 …

vim的特殊模式-可视化模式

可视化模式&#xff1a;按 v进入可视化模式 选中 y复制 d剪切/删除 可视化块模式: ctrlv 选中 y复制 d剪切/删除 示例&#xff1a; &#xff08;vim可视化模式的进阶使用&#xff1a;vim可视化模式的进阶操作-CSDN博客&#xff09;

UE5制作视差图

双目深度估计开源数据集很多都是用UE制作的&#xff0c;那么我们自己能否通过UE制作自己想要的场景的数据集呢。最近花了点时间研究了一下&#xff0c;分享给需要的小伙伴。 主要使用的是UnrealCV插件&#xff0c;UnrealCV是一个开源项目&#xff0c;旨在帮助计算机视觉研究人…