【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐

【动态规划】【字符串】扰乱字符串

本文涉及的基础知识点

二分查找算法合集
位运算

LeetCode100160. 价值和小于等于 K 的最大数字

给你一个整数 k 和一个整数 x 。
令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x == 0 且 s[i] 是 设置位 的 i 的数目。
请你返回 最大 整数 num ,满足从 1 到 num 的所有整数的 价值 和小于等于 k 。
注意:
一个整数二进制表示下 设置位 是值为 1 的数位。
一个整数的二进制表示下标从右到左编号,比方说如果 s == 11100 ,那么 s[4] == 1 且 s[2] == 0 。
示例 1:
输入:k = 9, x = 1
输出:6
解释:数字 1 ,2 ,3 ,4 ,5 和 6 二进制表示分别为 “1” ,“10” ,“11” ,“100” ,“101” 和 “110” 。
由于 x 等于 1 ,每个数字的价值分别为所有设置位的数目。
这些数字的所有设置位数目总数是 9 ,所以前 6 个数字的价值和为 9 。
所以答案为 6 。
示例 2:
输入:k = 7, x = 2
输出:9
解释:由于 x 等于 2 ,我们检查每个数字的偶数位。
2 和 3 在二进制表示下的第二个数位为设置位,所以它们的价值和为 2 。
6 和 7 在二进制表示下的第二个数位为设置位,所以它们的价值和为 2 。
8 和 9 在二进制表示下的第四个数位为设置位但第二个数位不是设置位,所以它们的价值和为 2 。
数字 1 ,4 和 5 在二进制下偶数位都不是设置位,所以它们的价值和为 0 。
10 在二进制表示下的第二个数位和第四个数位都是设置位,所以它的价值为 2 。
前 9 个数字的价值和为 6 。
前 10 个数字的价值和为 8,超过了 k = 7 ,所以答案为 9 。
提示:
1 <= k <= 1015
1 <= x <= 8

二分查找

随着num的增加,价值和单调增加。这是二分查找的基础。寻找最后一个符合条件的nums,用左闭右开空间。
如何求1到num第i位的价值和。 由于0不包括1,所以本问题等效与0到num的价值和。

i==00 1周期长度2
i==100 01 10 11…周期长度4
i==2000 001 010 011 100 101 110 111…周期长度8

周期长度 1<<i 。前半个周期,全部是0,后半个周期全部是1。

[0,num]共num+1个数。

  • 完整周期数:(num+1)/(1 << i ) 每个周期有半数1
  • 不足一个周期的数有iCnt2= (num+1)%(1<<i) 1的数量为:iCnt2-- (i <<i )/2 iCnt如果小于0,取0.

代码

核心代码

这周的LeetCode C++可能有问题,总溢出,所以加了不少判断。

class Solution {
public:long long findMaximumNumber(long long k, int x) {long long left = 0, r = 5e17;while (r - left > 1){const auto mid = left + (r - left) / 2;if (Cnt(mid, k,x) <= k){left = mid;}else{r = mid;}}return left;}long long Cnt(long long mid,int k,int x ){long long llCnt = 0;for (int ii = x; ii <= 60; ii += x){const long long tmp = 1LL << ii;//周期const long long cur1 = (mid + 1) / tmp * (tmp / 2);	const long long cur2 = max(0LL, (mid + 1) % tmp - tmp / 2);if (LLONG_MAX - llCnt < cur1){return k + 1;}llCnt += cur1;if (LLONG_MAX - llCnt < cur2){return k + 1;}llCnt += cur2;}return llCnt;}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}
}int main()
{long long k;int x;{Solution sln;k = 19, x = 6;auto res = sln.findMaximumNumber(k, x);Assert(50LL, res);}{Solution sln;k = 9, x = 1;auto res = sln.findMaximumNumber(k, x);Assert(6LL, res);}{Solution sln;k = 7, x = 2;auto res = sln.findMaximumNumber(k, x);Assert(9LL, res);}{Solution sln;k = 343883588590415, x = 1;auto res = sln.findMaximumNumber(k, x);//Assert(9LL, res);}	
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

数据分析---SQL(3)

目录 IF和CASE WHEN的区别IF函数示例CASE WHEN示例如何求字段整体的标准差和均值什么是笛卡尔积笛卡尔积通常的使用场景是什么rank、dense rank、row number的区别rank函数示例dense rank函数示例row number函数示例什么是窗口函数除了rank之外还有哪些窗口函数IF和CASE WHEN的…

阿里云ingress配置时间超时的参数

一、背景 在使用阿里云k8s集群的时候&#xff0c;内网API网关&#xff0c;刚开始是用的是Nginx&#xff0c;后面又搭建了ingress。 区别于nginx配置&#xff0c;ingress又该怎么设置参数呢&#xff1f;比如http超时时间等等。 本文会先梳理nginx是如何配置&#xff0c;再对比…

优雅的删除链表元

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 在数据结构&#xff1a;链表中&#xff0c;我们实现了链表的删除方法&#xff0c;但代码看起来并不“优雅”&#xff0c;那么今天我们就来尝试使用多种方法&#xff0c…

Halcon 3D相关算子(二)

(1) moments_object_model_3d( : : ObjectModel3D, MomentsToCalculate : Moments) 功能&#xff1a;计算3D对象模型的平均值或中心二阶矩。要计算3D物体模型点的平均值&#xff0c;在MomentsToCalculate中选择mean_points&#xff1b;如果要计算二阶中心矩&#xff0c;则选择…

windows安装conda环境,开发openai应用准备,运行第一个ai程序

文章目录 前言一、windows创建openai开发环境二、国内代理方式访问openai的方法&#xff08;简单方法&#xff09;三、测试运行第一个openai程序总结 前言 作者开发第一个openai应用的环境准备、第一个openai程序调用成功&#xff0c;做个记录&#xff0c;希望帮助新来的你。 …

如何处理Uniapp中的异步请求?

在Uniapp中处理异步请求有以下几种方法&#xff1a; 使用 uni.request 方法发送异步请求&#xff0c;该方法返回一个 Promise 对象&#xff0c;可以使用 then 方法处理请求成功的回调&#xff0c;使用 catch 方法处理请求失败的回调。 uni.request({url: http://api.example.…

鸿蒙系统ArkTs语法入门

鸿蒙系统ArkTs的ts语法入门 前言1. 变量声明2. 数据类型2.1 基本数据类型2.2 复杂数据类型2.3 联合类型2.4 空类型和未定义类型 3. 函数3.1 匿名函数和箭头函数 4. 类和接口类的访问权限接口类的继承内部类 7. 结构体参考材料 前言 每个语言都有控制流语句就不写测试代码了。a…

31 树的存储结构一

无法直接用数组表示树的逻辑结构&#xff0c;但是可以设计结构体数组对节点间的关系进行描述&#xff1a;【如表】 这样做的问题&#xff1a; 可以利用 组织链表 parent指针&#xff1a; 注意&#xff1a;树结点在 组织链表 中的位置不代表树的任何逻辑关系 树的架构图&#xf…

从0开始学Git指令(3)

从0开始学Git指令 因为网上的git文章优劣难评&#xff0c;大部分没有实操展示&#xff0c;所以打算自己从头整理一份完整的git实战教程&#xff0c;希望对大家能够起到帮助&#xff01; 远程仓库 Git是分布式版本控制系统&#xff0c;同一个Git仓库&#xff0c;可以分布到不…

ubuntu主机开启ssh服务,ubuntu通过ssh访问主机

1.ubuntu通过ssh访问主机 要在Ubuntu上通过SSH&#xff08;Secure Shell&#xff09;访问另一台主机&#xff0c;您需要确保几件事情&#xff1a; 目标主机上的SSH服务器&#xff1a;确保您要访问的主机上安装并运行了SSH服务器&#xff08;例如OpenSSH服务器&#xff09;。 …

java客户端连接redis并设置序列化处理

1、导入依赖 <!--继承父依赖--> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup paren…

服务器出现500、502、503错误的原因以及解决方法

服务器我们经常会遇到访问不了的情况有的时候是因为我们服务器被入侵了所以访问不了&#xff0c;有的时候是因为出现了服务器配置问题&#xff0c;或者软硬件出现问题导致的无法访问的问题&#xff0c;这时候会出现500、502、503等错误代码。基于以上问题我们第一步可以先重启服…

Chapter 7 类和对象的特性(上篇)

目的&#xff1a;认识类&#xff0c;对面向对象产生认识 &#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1…

【Py/Java/C++三种语言详解】LeetCode每日一题240114【链表】LeetCode83、删除排序链表中的重复节点

文章目录 题目链接题目描述解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode83、删除排序链表中的重复节点 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返…

Android json功能解析

1. 简介 JAVAScript Object Notation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;。  JSON采用兼容性很高的文本格式&#xf…

第 380 场周赛 解题报告 | 珂学家 | 数位DP 二分 + 字符串Hash

前言 整体评价 感觉T3更难些&#xff0c;T4太直接了&#xff0c;一般的KMP/StringHash基本就够用了。 上周T4出数位DP&#xff0c;估计是为T3打了一个铺垫。 A. 最大频率元素计数 思路: 模拟即可 class Solution {public int maxFrequencyElements(int[] nums) {Map<Int…

qt5.14.2配置opencv4.5.5

使用环境&#xff1a;windows&#xff0c;opencv4.5.5&#xff0c;qt5.14.2&#xff0c;msvc编译器 这里的opencv文件是已经编译好了&#xff0c;在qt工程中配置就可使用&#xff0c;编译器得是msvc才行&#xff0c;MinGW不管用。 资源地址&#xff1a;https://download.csdn.…

【深度学习每日小知识】Computer Vision 计算机视觉

计算机视觉是人工智能的一个领域&#xff0c;涉及算法和系统的开发&#xff0c;使计算机能够解释、理解和分析来自周围世界的视觉数据。这包括从静态图像到视频流甚至 3D 环境的一切。 使用对象检测和特征提取等方法&#xff0c;计算机视觉本质上需要从视觉输入中提取有用信息…

javascript,setTimeout定时器的精度可能不高,javascript引擎不是你想的那样

javascript引擎&#xff0c;它运行在宿主环境中&#xff0c;对前端来说&#xff0c;一般是web浏览器&#xff0c; 代码运行到浏览器。 专业术语: 事件循环&#xff1a;浏览器提供了一种机制来处理程序中多个块的执行&#xff0c;且执行每块时调用javascript引擎,这种机制被称为…

2023 IoTDB Summit:天谋科技高级开发工程师苏宇荣《汇其流:如何用 IoTDB 流处理框架玩转端边云融合》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…