备战秋招60天算法挑战,Day23

news2024/11/26 4:46:01

题目链接: https://leetcode.cn/problems/counting-bits/

视频题解: https://www.bilibili.com/video/BV1RE421w7C7/

LeetCode 338. 比特位计数

题目描述

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

举个例子:

输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10

知识回顾

动态规划是一种通过将原问题分解为子问题来求解复杂问题的算法思想。它通常用于求解最优化问题,例如最长公共子序列、背包问题等。动态规划的核心思想是将原问题分解为若干个子问题,通过求解子问题的最优解自下而上推导出原问题的最优解。

视频题解

比特位计数

思路来源

思路来源

思路解析

如果对区间[0, n]上的数逐个求对应二进制中1的个数是比较耗时的,下面来介绍使用动态规划来解此题。动态规划的关键是推导状态转移公式边界条件处理

下面介绍这道题目两种不同状态转移公式。

方法一

首先复习一下二进制的基本操作,如何获取n对应二进制的最右边一位和怎样n对应的二进制向右移一位

获取n对应二进制最右面一位有两种方式:

  1. n1进行与运算n & 1可以获取n对应二进制的最右面一位。
  2. n2取余n % 2即可获取n对应二进制的最右面一位。

n对应的二进制右移一位有两种方式:

  1. 直接使用编程语言自带的右移符号,比如c++可以写为n >> 1
  2. n / 2 也可以将n对应的二进制右移一位。

进入正题,定义dp[i]i的二进制中1的个数, 观察整数区间[0,4]对应的二进制。

4对应的二进制向右移动一位,就变成了2对应的二进制,42的二进制中的1是相同的。

dp[4] = dp[2]

3对应的二进制向右移动一位,就变成了1对应的二进制,3的二进制比1的二进制中1的个数多1

dp[3] = dp[1] + 1

总结上面的规律,得到状态转移公式如下:

如果整数i为偶数,也就是i的二进制最右面的bit位0,这个时候右移,二进制中的1并没有损失,dp[i] = dp[i/2]

如果整数i为奇数,也就是i的二进制最右面的bit位1,这个时候右移,二进制中的1会减少一个,dp[i] = dp[i/2] + 1

边界条件为: dp[0] = 0

C++代码

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> dp(n+1, 0);
        for (int i = 1; i <=n; ++i) {
            if (i % 2 == 0) {
                //i为偶数
                dp[i] = dp[i/2];
            } else {
                //i为奇数
                dp[i] = dp[i/2] + 1;
            }
        }
        return dp;
    }
       
};

java代码

class Solution {
    public int[] countBits(int n) {
        int[] dp = new int[n + 1];
        for (int i = 1; i <= n; ++i) {
            if (i % 2 == 0) {
                // i为偶数
                dp[i] = dp[i / 2];
            } else {
                // i为奇数
                dp[i] = dp[i / 2] + 1;
            }
        }
        return dp;
    }
}

python代码

class Solution:
    def countBits(self, n: int) -> List[int]:
        dp = [0] * (n + 1)
        for i in range(1, n + 1):
            if i % 2 == 0:
                # i为偶数
                dp[i] = dp[i // 2]
            else:
                # i为奇数
                dp[i] = dp[i // 2] + 1
        return dp

方法二

我们先介绍一个骚操作,对于一个整数nn & (n - 1)可以将n的二进制最右边值为1bit位置为0

在纸上继续按照上面步骤模拟一遍,会帮助大家更好的理解。

根据上面的操作可以知道n的二进制比n&(n-1)的二进制中的1多了1个,这样就可以得到状态转移公式:

dp[n] = dp[n&(n-1)] + 1

边界条件为: dp[0] = 0

C++代码

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> dp(n+1, 0);
        for (int i = 1; i <=n; ++i) {
           //状态转移公式
           res[i] = dp[i&(i-1)] + 1;
        }
        return dp;
    }   
};

java代码

class Solution {
    public int[] countBits(int n) {
        int[] dp = new int[n + 1];
        for (int i = 1; i <= n; ++i) {
            // 状态转移公式
            dp[i] = dp[i & (i - 1)] + 1;
        }
        return dp;
    }
}

python 代码

class Solution:
    def countBits(self, n: int) -> List[int]:
        dp = [0] * (n + 1)
        for i in range(1, n + 1):
            # 状态转移公式
            dp[i] = dp[i & (i - 1)] + 1
        return dp

复杂度分析

时间复杂度: 两种方法都是O(n),因为只遍历一遍区间[0, n]

空间复杂度: 两种方法都是O(n),只用到一个长度为n+1的数组dp

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

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

相关文章

我店平台商业模式案例分析

我店平台是一家综合性的新消费平台&#xff0c;其商业模式结合了“互联网实体终端”的理念&#xff0c;通过数字化技术促进消费生态的升级和变革。以下是对该平台商业模式的概述&#xff1a; 平台定位 我店平台的目标是建立一个消费者、商家和平台三者都能从中受益的消费生态圈…

特斯拉电动卡车事故引发安全调查,汽车制造商电动车战略调整

特斯拉电动卡车事故引关注 周三&#xff0c;美国国家运输安全委员会宣布启动对特斯拉电动半挂卡车在加州高速上发生的事故及随后起火事件的全面调查。此次调查将联合加州公路巡警局共同进行&#xff0c;旨在查明事故原因&#xff0c;确保道路安全。事故发生在周一深夜&#xff…

性价比运动耳机有哪些?五大性价比运动耳机推荐!

作为一名资深的数码爱好者&#xff0c;我一直对各种新型耳机产品保持着浓厚的兴趣。最近&#xff0c;我因为很多运动爱好者都在询问什么耳机是比较适合运动的时候使用的&#xff0c;看了市面上的产品&#xff0c;开放式耳机无疑是一个不错的选择&#xff0c;它因为采用人体工学…

控制反转(IOC)——Spring第一个核心思想

控制反转概述 控制反转&#xff08;IoC&#xff09;是一种将对象的创建、组装和管理交给容器或框架来实现的编程思想。它可以减低对象之间的耦合度&#xff0c;提高代码的灵活性和模块化。控制反转的一种常见形式是依赖注入&#xff08;DI&#xff09;&#xff0c;即对象的依赖…

Godot模拟实现多人游戏平滑移动

最近几天接触到Godot,发现是一个很不错的免费开源游戏引擎,游戏本身实现了多人对战游戏之间同步功能(好像更适合于即时对战类,而且对战人数对计算机的性能要求高); 如果要实现一个大型的游戏,1个服务端(长期运行)对应N多个客户端(随时运行)需要怎么实现,不知道是不…

Rust到底值不值得学

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust是近两年呼声比较高的一种新型开发语言&#xff0c;市场占有量并不大&#xff0c;但增长速度极为迅猛。 有人统计过&#xff0c;…

【访客管理系统】基于低代码+golang+人脸识别技术实现的访客管理系统

概述 访客预约-审批-核验流程 5个步骤&#xff1a;生成邀约 -> 访客填写信息 -> 企业员工审批 -> 访客获取凭证 -> 访客核验入园 访客核验方式 4种方式&#xff1a;二维码&#xff0c;身份证&#xff0c;人证核验&#xff0c;人脸识别 工作台 资料管理 园区管…

消息可靠性

若支付服务和mq之前网络链接失败/mq挂掉/交易服务挂掉,都有可以让支付订单无法更新,所以导致发送者不可靠,mq本身不可靠,消费者不可靠,消息延迟,针对以下问题 生产者可靠性 支付服务和mq之间有可能连不上,连不上怎么办,可以增加失败重连 配置文件中配置-重连 测试结果…

栈相关的算法

抽象&#xff1a; 不能处理的信息&#xff1a;暂时入栈。 能处理的信息&#xff1a;从栈里面选择信息&#xff0c;加工处理&#xff0c;并出栈。 一、括号匹配算法 左括号等待匹配&#xff0c;所以入栈等待匹配。 右边括号就要判断是否匹配&#xff0c;所以判断是否匹配并出…

如何设置PowerBI报告展示在屏幕的大小?

问题描述: 业务部门同事反馈&#xff0c;将开发的Power BI报告发布到Power BI服务站点后&#xff0c;用户通过不同尺寸的电子设备打开报告看到的效果不一样&#xff0c;如用PC打开报告可以在一屏中完整显示所有报告可视化组件如图&#xff1a; 但是用手机或者PAD类小尺寸电子设…

【好书推荐】值得深读的EMC参考书籍

以下排序不分先后&#xff0c;都是好书&#xff01; 书名&#xff1a;Electromagnetic Compatibility Engineering 作者&#xff1a;Henry W. Ott 这本书的讨论重点放在了经济高效的EMC设计上&#xff0c;并将数学的数量和复杂度保持在最低限度&#xff0c;辅以 250 多个带有…

【Qt笔记】Qt建立UDP通信

目录 一、前言 二、服务端 ①在项目配置文件中加入network模板 ②创立一个继承自QObject的UdpServer的类 ③构造函数的实现 ④读取信息函数的实现 三、客户端 ①绑定服务端的IP地址和端口号 ②发送数据报给服务端 四、实现效果 一、前言 UDP&#xff08;User Datagr…

流苏马兜铃Aristolochia fimbriata参考基因组

推荐官网&#xff0c;一个和无油樟一样没发生过全基因组复制事件的代表性物种。 文章同链接 如何获取mostly单拷贝和strictly单拷贝基因 Insights into angiosperm evolution, floral development and chemical biosynthesis from the Aristolochia fimbriata genome https:…

微服务CI/CD实践(一)环境准备及虚拟机创建

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;gitlabs部署 微服务CI/CD实践&#xff08;三&#xff09;nexus3部署 微服务CI/CD实践&#xff08;四&#xff09;数据库,redis,n…

天猫商品评论API:获取商品热门评价与最新评价

天猫&#xff08;Tmall&#xff09;作为中国最大的B2C电商平台之一&#xff0c;提供了丰富的商品和服务。然而&#xff0c;天猫并没有直接公开一个通用的API来允许第三方开发者直接获取商品的热门评价或最新评价。这主要是出于保护用户隐私、防止恶意抓取和滥用数据等考虑。 不…

SpringIoCDI

前言&#x1f440;~ 上一章我们介绍了Spring MVC&#xff0c;今天介绍Spring核心功能之一IoC Spring到底是什么&#xff1f; Spring IoC 什么是 IoC 容器&#xff1f; IoC 介绍 DI 介绍 IoC详解 获取Bean对象的其他方式 Bean的存储 方法注解 Bean 扫描路径 DI详解 …

计算机网络——TCP协议与UDP协议详解(下)

一、TCP协议 1.1 TCP协议的报文 TCP全称为 "传输控制协议(Transmission Control Protocol")。人如其名&#xff0c;要对数据的传输进行一个详细的控制。我们先看其报文格式&#xff0c;如下图&#xff1a; TCP报文由以下几个字段组成&#xff1a; 源端口号和目标端口…

【第三版 系统集成项目管理工程师】第13章 监控过程组

持续更新。。。。。。。。。。。。。。。 【第三版】第十三章 监控过程组 13.1控制质量13.1.1主要输入1.项目管理计划-P4992.项目文件-P4993.批准的变更请求-P5004.可交付成果-P5005.工作绩效数据-P500 13.1.2主要工具与技术1.数据收集-P5002.数据分析-P5003.检查-P5014.测试/…

数据结构—— 初识二叉树

1.树概念及结构 1.1树的概念 树是由根和子树构成 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 1. 树有…

安卓设备使用Linux运行Python sklearn进行机器学习. 2024-08-19

0. 测试环境 设备: 国美u7 系统: 安卓7.1(armv8a) 工具软件termux: Termux GitHub linux发行版: archlinux (aarch64) 1. Android手机安装termux (1)下载与安装termux : Releases termux/termux-app GitHub 根据设备处理器和系统框架选择适宜的最新版本. 这里我选择: …