LeetCode题练习与总结:不含连续1的非负整数--600
一、题目描述
给定一个正整数 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]。
- 如果最高位是 0,那么剩下的
- 因此,状态转移方程为:
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位是1if ((n & (1 << i)) != 0) {// 累加dp[i]ans += dp[i];// 如果前一位也是1,则停止循环if (prev_bit == 1) {break;}// 更新prev_bitprev_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语句返回最终计算的结果。
- 使用
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。
相关文章:
LeetCode题练习与总结:不含连续1的非负整数--600
一、题目描述 给定一个正整数 n ,请你统计在 [0, n] 范围的非负整数中,有多少个整数的二进制表示中不存在 连续的 1 。 示例 1: 输入: n 5 输出: 5 解释: 下面列出范围在 [0, 5] 的非负整数与其对应的二进制表示: 0 : 0 1 : 1 2 : 10 3 :…...
AndroidCompose Navigation导航精通1-基本页面导航与ViewPager
文章目录 前言基本页面导航库依赖导航核心部件简单NavHost实现ViewPagerPager切换逻辑图阐述Pager导航实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来…...
【环境搭建】1.1源码下载与同步
目录 写在前面 一,系统要求 二,安装depot_tools 三,获取代码 四,代码同步 五,代码结构 写在前面 当前的开发背景是基于Google的开源Chromium,来开发Android设备的浏览器方案。 一,系统要…...
Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
python | OpenCV小记(一):cv2.imread(f)读取图像操作 1. 为什么 [:, :, 0] 提取的是第一个通道(B 通道)?OpenCV 的通道存储格式索引操作 [:, :, 0] 的解释常见误解 1. 为什么 [:, :,…...
C语言指针专题四 -- 多级指针
目录 1. 多级指针的核心原理 1. 多级指针的定义 2. 内存结构示意图 3. 多级指针的用途 2. 编程实例 实例1:二级指针操作(修改一级指针的值) 实例2:动态二维数组(二级指针) 实例3:三级指…...
本地部署 DeepSeek-R1 大模型
本地部署 DeepSeek-R1 大模型指南 1. 引言 1.1 DeepSeek-R1 模型简介 在人工智能的世界里,大型语言模型(LLM)正如一座巨大的宝库,里面储存着丰富的信息和无限的潜力。而DeepSeek-R1,就像那扇打开智慧之门的钥匙。它…...
深度学习的应用
目录 一、机器视觉 1.1 应用场景 1.2 常见的计算机视觉任务 1.2.1 图像分类 1.2.2 目标检测 1.2.3 图像分割 二、自然语言处理 三、推荐系统 3.1 常用的推荐系统算法实现方案 四、图像分类实验补充 4.1 CIFAR-100 数据集实验 实验代码 4.2 CIFAR-10 实验代码 深…...
想学习Python编程,应该如何去学习呢
学习Python编程是一个循序渐进的过程,以下是一个详细的学习路径和建议: 一、基础入门 安装Python环境: 从Python官方网站下载并安装适合你操作系统的Python版本。确保将Python添加到系统路径中,以便在命令行中方便地访问。 学习…...
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、更新系统包:2、…...
吴恩达深度学习——有效运作神经网络
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...
《DeepSeek-R1 问世,智能搜索领域迎来新变革》
DeepSeek-R1是由DeepSeek公司开发的一款创新型人工智能模型,自2024年5月7日发布以来,迅速在AI领域引起广泛关注。该模型凭借其卓越的语言理解能力、高效的数据处理能力、自适应学习能力、高安全性与可靠性以及广泛的应用场景与拓展性,在众多人…...
深入解析 Linux 内核中的页面错误处理机制
在现代操作系统中,页面错误(Page Fault)是内存管理的重要组成部分。当程序试图访问未映射到物理内存的虚拟内存地址时,CPU 会触发页面错误异常。Linux 内核通过一系列复杂的机制来处理这些异常,确保系统的稳定性和性能。本文将深入解析 Linux 内核中处理页面错误的核心代码…...
Java手写简单Merkle树
Java手写Merkle树代码 package com.blockchain.qgy.component;import com.blockchain.qgy.model.MerkleTreeNode; import com.blockchain.qgy.util.SHAUtil;import java.util.*;public class MerkleTree<T> {//merkle树private List<MerkleTreeNode<T>> lis…...
DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)
文章目录 引言1. 概述2. 领域驱动设计(DDD)分层架构模型2.1 DDD的核心概念2.2 DDD架构分层解析 3. 整洁架构:洋葱架构与依赖倒置3.1 整洁架构的核心思想3.2 整洁架构的层次结构 4. 六边形架构:解耦核心业务与外部系统4.1 六边形架…...
数据结构与算法之二叉树: LeetCode LCP 10. 二叉树任务调度 (Ts版)
二叉树任务调度 https://leetcode.cn/problems/er-cha-shu-ren-wu-diao-du/description/ 描述 任务调度优化是计算机性能优化的关键任务之一。在任务众多时,不同的调度策略可能会得到不同的总体执行时间,因此寻求一个最优的调度方案是非常有必要的 通…...
在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入
现有AWS EMR集群上运行PySpark代码,可以读写S3上的数据文件,Snowflake数据仓库也需要导入S3上的文件到表。现在要用AWS KMS有客户端密钥加密S3上的文件,同时允许PySpark代码,可以读写S3上的数据文件,Snowflake数据仓库…...
玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...
如何进行API版本控制?
一、URI路径版本控制(Path Versioning) 通过在API的URL路径中包含版本号来实现。例如: /api/v1/products /api/v2/products 这种方法最为直观,用户可以根据URL判断版本。它的优点是简单易懂,容易实现。但如果接口变动频繁,可能会导致大量的路径不同版本的接口需要维护…...
计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
### 2024 江西省赛题解(A,C,D,G,H,J,K,L) BEFI待补
A. 输出 a b c abc abc 即可。 void slove () {int a, b, c;cin >> a >> b >> c;cout << (a b c) << endl; }B. C. 如果 ∑ i 1 n a i S \sum_{i1}^{n}a_iS ∑i1naiS 那么存在所有人说的都是真话的可能。 否则,我们…...
Ruby 类和对象
Ruby 类和对象 引言 在软件开发中,类和对象是面向对象编程(OOP)的核心概念。Ruby 作为一种动态、解释型编程语言,也以简洁的方式支持面向对象编程。本文将深入探讨 Ruby 中的类和对象,包括它们的定义、创建、使用以及一些高级特性。 类与对象的定义 类 在 Ruby 中,类…...
【自学笔记】JavaWeb的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JavaWeb知识点一、基础概念二、项目结构三、Tomcat服务器四、数据库连接(JDBC)五、前端技术六、高级技术 总结 以下是JavaWeb知识点的MD格式…...
OpenCV:闭运算
目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 OpenCV:开运算-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…...
万物皆有联系:驼鸟和布什
布什?一块布十块钱吗?不是,大家都知道,美国有两个总统,叫老布什和小布什,因为两个布什总统(父子俩),大家就这么叫来着,目的是为了好区分。 布什总统的布什&a…...
nodejs:js-mdict 的下载、安装、测试、build
js-mdict 项目的目录结构:js-mdict 项目教程 js-mdict 下载地址: js-mdict-master.zip 先解压到 D:\Source\ js-mdict 6.0.2 用了 ts (TypeScript) 和 Jest,增加了应用开发的难度,因为先要了解 ts 和 Jest。 参阅:测试与开发&a…...
< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机
原因: < OS 有关 > 阿里云:轻量应用服务器 的使用 :从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作: 查看进程&#x…...
sqlzoo答案4:SELECT within SELECT Tutorial
sql练习:SELECT within SELECT Tutorial - SQLZoo world表: namecontinentareapopulationgdpAfghanistanAsia6522302550010020343000000AlbaniaEurope28748283174112960000000AlgeriaAfrica238174137100000188681000000AndorraEurope46878115371200000…...
Ubuntu全面卸载mysql
如果你已经看到whereis mysql输出了与MySQL相关的路径,说明MySQL仍然存在于系统中。要卸载MySQL,可以按照以下步骤操作,确保完全删除所有相关的文件和配置: 1. 停止MySQL服务 首先,停止MySQL服务: sudo …...
