LeetCode 2859.计算K置位下标对应元素的和

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

请你用整数形式返回 nums 中的特定元素之 和 ,这些特定元素满足:其对应下标的二进制表示中恰存在 k 个置位。

整数的二进制表示中的 1 就是这个整数的 置位 。

例如,21 的二进制表示为 10101 ,其中有 3 个置位。

示例 1:

输入:nums = [5,10,1,5,2], k = 1
输出:13
解释:下标的二进制表示是:
0 = 0002
1 = 0012
2 = 0102
3 = 0112
4 = 1002
下标 1、2 和 4 在其二进制表示中都存在 k = 1 个置位。
因此,答案为 nums[1] + nums[2] + nums[4] = 13 。
示例 2:

输入:nums = [4,3,2,1], k = 2
输出:1
解释:下标的二进制表示是:
0 = 002
1 = 012
2 = 102
3 = 112
只有下标 3 的二进制表示中存在 k = 2 个置位。
因此,答案为 nums[3] = 1 。

提示:

1 <= nums.length <= 1000
1 <= nums[i] <= 105
0 <= k <= 10

法一:直接模拟:

class Solution {
public:int sumIndicesWithKSetBits(vector<int>& nums, int k) {int ans = 0;for (int i = 0; i < nums.size(); ++i){if (count1bit(i) == k){ans += nums[i];}}return ans;}private:int count1bit(int n){int ans = 0;while (n){++ans;n = n & (n - 1);}return ans;}
};

如果nums的长度为n,nums中元素为m,则此算法时间复杂度为O(nlogm),空间复杂度为O(1)。

法二:我们可以优化求一个二进制数中1的个数的过程,题目中规定了数组的大小最大为1000,可以用10位二进制数表示,我们将其表示为abcdefghij,我们要求的实际是a+b+c+d+e+f+g+h+i+j,可以用分治法求和:
第一步:求0a0c0e0g0i+0b0d0f0h0j,由于0a+0b一定不会产生进位,最多为2位,因此我们可以将ab的和看做一个数字(ab),即结果是(ab)(cd)(ef)(gh)(ij),此时(ab)+(cd)+(ef)+(gh)+(ij)的结果等于a+b+c+d+e+f+g+h+i+j。

第二步:重复上一步,即(ab)+(cdef)+(ghij)的结果等于a+b+c+d+e+f+g+h+i+j。

第三步:此时只有3项了,可以直接求,即算出(ab)、(cdef)、(ghij)的值并相加即可:

class Solution {
public:int sumIndicesWithKSetBits(vector<int>& nums, int k) {int ans = 0;for (int i = 0; i < nums.size(); ++i){if (count1bit(i) == k){ans += nums[i];}}return ans;}private:int count1bit(int n){n = (0b0101010101 & n) + ((0b1010101010 & n) >> 1);n = ((0b0011001100 & n) >> 2) + (0b1100110011 & n);return (n >> 8) + ((n >> 4) & 0b1111) + n & 0b1111;}
};

如果nums的大小为n,nums最大为m,则此算法时间复杂度为O(nloglogm),因为m有logm个二进制位(如上例中的10),而我们计算这logm个二进制位中的1时又用了分治算法,因此再取一层对数;空间复杂度为O(1)。

法三:使用内置函数__builtin_popcount:

class Solution {
public:int sumIndicesWithKSetBits(vector<int>& nums, int k) {int ans = 0;for (int i = 0; i < nums.size(); ++i){if (__builtin_popcount(i) == k){ans += nums[i];}}return ans;}
};

__builtin_popcount函数的时间复杂度为O(1),如果nums的大小为n,此算法时间复杂度为O(n),空间复杂度为O(1)。

法四:从最小的k置位数开始,计算所有的k置位数,这样只需遍历符合k置位数遍:

class Solution {
public:int sumIndicesWithKSetBits(vector<int>& nums, int k) {if (k == 0){return nums[0];}int ans = 0;int index = (1 << k) - 1;while (index < nums.size()){ans += nums[index];// 每次只加lowbit,保证1的位数只会减少index += index & (-index);int bit1Num = __builtin_popcount(index);// 由于每次都加lowbit导致的1的位数减少,因此低位一定是0if (bit1Num < k){index |= (1 << k - bit1Num) - 1;}}return ans;}
};

如果有n个K置位数,此算法时间复杂度为O(n),空间复杂度为O(1)。

法五:gosper’s hack,类似法四,gosper’s hack的作用是,给定一个K置位数后,求出比该K置位数大的最小的K置位数,相当于将所有K置位数排序后,给定一个K置位数,获取排序后的下一个K置位数。步骤为,找到当前K置位数最右边的01,然后将其变为10,再将10右面的1放到最右面,以下是一组3置位数,可供参考:
00111
01011
01101
01110
10011
10101
10110
11001
11010
11100

对于Gosper’s Hack的实现,直接看代码:

class Solution {
public:int sumIndicesWithKSetBits(vector<int>& nums, int k) {if (k == 0){return nums[0];}int ans = 0;int index = (1 << k) - 1;while (index < nums.size()){ans += nums[index];// 如果index是10110,则lowbit是10int lowbit = index & (-index);// temp是11000,temp计算出的是index的下一个K置位数的高位部分int temp = index + lowbit;// temp和index的异或结果为01到右面的最后一个1是1,其他是0// 即异或结果为01110,异或结果有3个1,是因为01...1(x个1)在10110中有3位// 接下来需要把index中01后面的1全部移动到最右边,即右移2(01)加上01...10...0中的最后面的0的个数位// 即__builtin_ctz(lowbit) + 2位,再与temp相与,就是下一个K置位数index = ((temp ^ index) >> __builtin_ctz(lowbit) + 2) | temp;// or index = (((temp ^ index) >> 2) / lowbit) | temp;}return ans;}
};

如果有n个K置位数,此算法时间复杂度为O(n),空间复杂度为O(1)。

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

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

相关文章

Threejs 实现3D影像地图,Json地图,地图下钻

1.使用threejs实现3D影像地图效果&#xff0c;整体效果看起来还可以&#xff0c;底层抽象了基类&#xff0c;实现了通用&#xff0c;对任意省份&#xff0c;城市都可以只替换数据&#xff0c;即可轻松实现效果。 效果如下&#xff1a; 链接https://www.bilibili.com/video/BV1…

Javascript 函数和对象

【六】函数 函数&#xff08;Function&#xff09;是一种可重复使用的代码块&#xff0c;用于执行特定的任务或计算&#xff0c;并可以接受参数和返回值。 【1】函数声明 function functionName(parameter1, parameter2, ...) {// 函数体// 执行特定的任务或计算// 可以使用…

H5/CSS 笔试面试考题(91-100)

简述div 元素的哪些 CSS 属性的默认值为 0 ( ) A:border-top-width B:outline-width C:padding-top D:margin-top 面试通过率:76.0% 推荐指数: ★★★ 试题难度: 初级 试题类型: 选择题 答案:c、d 简述下列关于背景定位属性 background-position 说法正确的是 ( ) A:…

嵌入式学习笔记总结Day24

今天进入了下一个阶段的学习——进程与线程的学习 今天主要了解了进程的相关知识以及linux系统中对进程进行控制的一些函数接口 一、概念 程序:存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消…

【人工智能高频面试题--基本篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;人工智能高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 人工智能高频面试题--基本篇 1.深度学习和过往的神经网络训练方法有什么区别&#xff1f;列举…

Linux互斥体的驱动程序测试

一. 简介 上一篇文章学习如何在驱动代码中使用互斥锁。文章地址如下: Linux内核中处理并发与竞争的互斥体的驱动实现-CSDN博客 本文对所实现的驱动进行测试。确定互斥锁是否实现对 Led设备的互斥访问,即一次只能一个应用程序访问Led设备。 二. Linux互斥体的驱动程序测试…

LED流水灯实验

#include "reg52.h" #include <intrins.h> //包含函数_crol_,_cror_ typedef unsigned int u16; //对系统默认参数重新定义 typedef unsigned char u8; #define LED_PORT P2 //使用宏定义P2端口 void delay_10…

Panalog大数据日志审计系统libres_syn_delete.php命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1、产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校…

Element UI 组件的安装及使用

Element UI是基于Vue.js 的一套企业级的前端UI 组件库&#xff0c;它包含了丰富的UI组件供开发者使用&#xff0c;极大的提高生产效率。这篇文章将帮你快速了解Element UI的安装和使用。 一、安装 Element UI 首先&#xff0c;你需要在你的环境中安装Node.js&#xff0c;因为…

【.xml文件匹配不到】⭐️解决使用mybatis-plus找不到对应的xml文件导致的持久层方法报错

前言 小伙伴们大家好&#xff0c;很快嗷&#xff0c;到了年后的第一周&#xff0c;最近在自己电脑上敲项目时遇到一个平时可能不怎么遇到的问题&#xff0c;就是mybatis持久层框架使用时找不到对应的xml配置文件&#xff0c;也就导致自己写的持久层方法报错 接口报错内容&…

win11修改网络算法为BBR2_提升网络环境质量

Win11 BBR2 是Google开发的一种高效的网络拥塞控制算法&#xff0c;玩 Linux 的朋友应该对它还有锐速不陌生。相比Windows默认使用的 CUBIC 算法&#xff0c;BBR2 在网络吞吐量、延迟、全局性能等方面都有一定优势。 如果你日常网络经常丢包或者高延迟可以尝试切换为BBR2算法。…

实施工程师前后端项目部署流程一次完成

目录 一、jdk安装具体步骤 二、tomcat安装具体步骤 三、MySql具体步骤 修改密码 登录 四、nginx安装 4.1、Nginx 4.2、操作步骤 安装ssl证书&#xff08;https&#xff09; 开80端口 测试 设置自启动 五、后端部署tomcat负载均衡 5.1、为什么要使用 5.2、搭建ngin…

抖音视频提取软件怎么用|抖音数据抓取工具

针对用户获取抖音视频的需求&#xff0c;我们开发了一款功能强大的抖音视频提取软件&#xff0c;旨在帮助用户轻松获取他们感兴趣的视频内容。无需逐个复制链接&#xff0c;无需繁琐的下载步骤&#xff0c;我们的软件让抖音视频获取变得简单快捷。 使用我们的软件非常简单&…

Open3D 基于最小生成树的法线定向 (27)

Open3D 基于最小生成树的法线定向 (27) 一、算法介绍二、算法实现一、算法介绍 法线计算的方向通常都存在方向问题,用Open3D估计的点云法线,是在每个点的局部进行拟合,估计的法线方向并不一致,Open3D提供了使用最小生成树调整法线到统一方向的方法,下面是具体的实现代码…

停车场管理(C语言)

【题目描述】停车场管理。设有一个可以停放n辆汽车的狭长停车场&#xff0c;它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) 。如果停车场已放满n辆车&#xff0c;则以后到达的车…

从Unity到Three.js(outline 模型描边功能)

指定模型高亮功能&#xff0c;附带设置背景颜色&#xff0c;获取随机数方法。 百度查看说是gltf格式的模型可以携带PBR材质信息&#xff0c;如果可以这样&#xff0c;那就完全可以在blender中配置好材质导出了&#xff0c;也就不需要像在unity中调整参数了。 import * as THRE…

从零实现一套低代码(保姆级教程)【后端服务】 --- 【22】实现数据库管理的前端页面

摘要 在上一篇中&#xff0c;我们实现了三个接口&#xff1a; 新增实体的接口删除实体的接口获取实体列表的接口 其实复杂的地方在于&#xff0c;我们创建一个实体&#xff0c;是在数据库中创建了一张表。而这张表中的数据&#xff0c;是要根据低代码平台中的操作进行更改。…

Qt中使用openGL

1. Qt与OpenGL的整合 Qt提供了QOpenGLWidget类&#xff0c;这是一个集成了OpenGL渲染能力的QWidget。通过使用QOpenGLWidget&#xff0c;开发者可以在Qt应用程序中嵌入OpenGL渲染的图形。QOpenGLWidget提供了一个框架&#xff0c;让OpenGL的渲染能够很好地集成在Qt的事件驱动模…

基于pytorch使用LSTM实现文本匹配任务

本文学习纪录 PyTorch深度学习项目实战100例 使用LSTM来实现文本匹配任务 使用LSTM&#xff08;Long Short-Term Memory&#xff09;网络来实现文本匹配任务是自然语言处理&#xff08;NLP&#xff09;中的一个常见应用。文本匹配任务的目标是确定两个文本段落是否在某种程度…

Vue + Echarts页面内存占用高问题解决

Vue Echarts页面内存占用高问题解决 1.问题描述 目前使用的是Vue2 Echarts4.x的组合&#xff0c;页面如下所示。 就是一个类似于神策的数据看板页面&#xff0c;左侧是一个导航栏&#xff0c;右侧看板页面中包含很多个报表图片&#xff0c;其中报表页面中对Echarts图表进…