Leetcode 第 380 场周赛 Problem C 价值和小于等于 K 的最大数字(Java + 二分答案 + 规律)

文章目录

  • 题目
  • 思路
    • Java + 二分答案 + 规律
    • 第 1 步:
    • 第 2 步:
    • 第 3 步:
    • 第 4 步:
  • 复杂度
  • Code

题目

  • Problem: 100160. 价值和小于等于 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 <= 10 ^ 15
    • 1 <= x <= 8

思路

Java + 二分答案 + 规律

第 1 步:

  • 首先 [1, maxNum] 在确定 x 后显然满足"价值和"单调非递减,因此可以二分最大值 maxNum
  • 其次需要确定 [1, maxNum] 在确定 x 的"价值和"就行

第 2 步:

  • 二分答案确定上下界:
    • k 最小为 1,x 最小为 1 代表每一位均统计,此时结果最小、即下界为 1
    • k 最大为 1e15,x 最大为 8 代表每 8 位统计一次、即每 2^8 个数最少会记录 1 次,此时结果最大,而开始的 [1, 2^8-1] 在 x=8 时不统计,因此上界就是 (k+1)*2^8-1

第 3 步:

  • [1, maxNum] 在 x 下的"价值和"可以找规律,我们先写出 [1, 8] 的二进制:
  • 0001
  • 0010
  • 0011
  • 0100
  • 0101
  • 0110
  • 0111
  • 1000
  • 按题意最后一位往前看(可以多写几位来看):
    • 第 1 位是先零位 0 然后"一位 1 一位 0"的 10 依次循环
    • 第 2 位是先一位 0 然后"两位 1 两位 0"的 10 依次循环
    • 第 3 位是先三位 0 然后"四位 1 四位 0"的 10 依次循环
    • 第 4 位是先七位 0 然后"八位 1 八位 0"的 10 依次循环
  • 如果我们前面加上 0,可以得到第 i 位是 “2^(i-1) 位 0 与 2^(i-1) 位 1” 的 01 依次循环

第 4 步:

  • 对于 [1, maxNum] 先转化为 [0, maxNum] 总共 maxNum+1 个数,
  • 然后循环 long 总共的 63 位 i,当满足 (i % x == 0) 时,记录第 i 位"价值和",
  • 分为前面循环的 1 + 可能有的最后一个不完整的循环 1
  • 前面循环的 1,先除循环再乘完整的 1:(maxNum + 1) / 2^i * 2^(i-1)
  • 可能有的最后一个不完整的循环 1,先减去完整循环再减去开头的 0:max((maxNum + 1) % 2^i - 2^(i-1), 0)

复杂度

时间复杂度:

时间复杂度: O ( 63 ∗ l o g ( k < < x ) ) O(63*log(k<<x)) O(63log(k<<x))

空间复杂度:

空间复杂度: O ( n ) O(n) O(n)

Code

class Solution {/*** Java + 二分答案 + 规律:** 第 1 步:* 首先 [1, maxNum] 在确定 x 后显然满足"价值和"单调非递减,因此可以二分最大值 maxNum,* 其次需要确定 [1, maxNum] 在确定 x 的"价值和"就行** 第 2 步:* 二分答案确定上下界:*     * k 最小为 1,x 最小为 1 代表每一位均统计,此时结果最小、即下界为 1*     * k 最大为 1e15,x 最大为 8 代表每 8 位统计一次、即每 2^8 个数最少会记录 1 次,此时结果最大,而开始的 [1, 2^8-1] 在 x=8 时不统计,因此上界就是 (k+1)*2^8-1** 第 3 步:* [1, maxNum] 在 x 下的"价值和"可以找规律,我们先写出 [1, 8] 的二进制:* 0001* 0010* 0011* 0100* 0101* 0110* 0111* 1000* 按题意最后一位往前看(可以多写几位来看):*     * 第 1 位是先零位 0 然后"一位 1 一位 0"的 10 依次循环*     * 第 2 位是先一位 0 然后"两位 1 两位 0"的 10 依次循环*     * 第 3 位是先三位 0 然后"四位 1 四位 0"的 10 依次循环*     * 第 4 位是先七位 0 然后"八位 1 八位 0"的 10 依次循环* 如果我们前面加上 0,可以得到第 i 位是 "2^(i-1) 位 0 与 2^(i-1) 位 1" 的 01 依次循环,** 第 4 步:* 对于 [1, maxNum] 先转化为 [0, maxNum] 总共 maxNum+1 个数,* 然后循环 long 总共的 63 位 i,当满足 (i % x == 0) 时,记录第 i 位"价值和",* 分为前面循环的 1 + 可能有的最后一个不完整的循环 1* 前面循环的 1,先除循环再乘完整的 1:(maxNum + 1) / 2^i * 2^(i-1)* 可能有的最后一个不完整的循环 1,先减去完整循环再减去开头的 0:max((maxNum + 1) % 2^i - 2^(i-1), 0)* 时间复杂度:O(63*log(k<<x)),空间复杂度:O(1)**/public long findMaximumNumber(long k, int x) {// 二分答案,确定上下界long left = 1;long right = (k + 1) << x - 1;long res = 1;while (left <= right) {// 避免加法溢出long mid = ((right - left) >> 1) + left;// 获取 [1, mid] 在 x 下的"价值和"long count = getCount(mid, x);if (count <= k) {res = mid;left = mid + 1;} else {right = mid - 1;}}return res;}/*** 获取 [1, maxNum] 在 x 下的"价值和"*/private long getCount(long maxNum, int x) {long res = 0;// long 的最大值有 63 位for (int i = 1; i <= 63; i++) {if (i % x == 0) {// 获取每个循环之和res += (maxNum + 1) / (1L << i) * (1L << i - 1);// 获取可能有的最后一个不完整的循环res += Math.max((maxNum + 1) % (1L << i) - (1L << i - 1), 0);}}return res;}
}

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

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

相关文章

【ESP32接入语言大模型之智谱清言】

1. 智谱清言 讲解视频&#xff1a; 随着人工智能技术的不断发展&#xff0c;自然语言处理领域也得到了广泛的关注和应用。智谱清言作为千亿参数对话模型 基于ChatGLM2模型开发&#xff0c;支持多轮对话&#xff0c;具备内容创作、信息归纳总结等能力。可以快速注册体验中国版…

远程开发之vscode端口转发

远程开发之vscode端口转发 涉及的软件forwarded port 通过端口转发&#xff0c;实现在本地电脑上访问远程服务器上的内网的服务。 涉及的软件 vscode、ssh forwarded port 在ports界面中的port字段&#xff0c;填需要转发的IP:PORT&#xff0c;即可转发远程服务器中的内网端…

增强FAQ搜索引擎:发挥Elasticsearch中KNN的威力

英文原文地址&#xff1a;https://medium.com/nerd-for-tech/enhancing-faq-search-engines-harnessing-the-power-of-knn-in-elasticsearch-76076f670580 增强FAQ搜索引擎&#xff1a;发挥Elasticsearch中KNN的威力 2023 年 10 月 21 日 在一个快速准确的信息检索至关重要的…

探索C语言1:冷知识一瞥

C语言&#xff0c;作为一门古老而强大的编程语言&#xff0c;深藏着许多令人惊奇的冷知识。在这篇博客中&#xff0c;我们将一窥C语言的一些不太为人熟知的特性和概念&#xff0c;为你揭示这门编程语言的深奥之处。 字符串数组与指针的巧妙结合 在C语言中&#xff0c;字符串经…

基于MOD02/MYD02获得亮度温度再转冰温

用HEG处理MOD02/MYD02,提取里面的EV_1KM_Emissive波段,band为11和12(其实就是band 31和32)。注意这里的band和output dile type 1. 获得之后,转辐射亮度。 参考:https://www.cnblogs.com/enviidl/p/16539422.html radiance_scales,和radiance_offset这两项参数代表波段…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64&#xff0c;下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init&#xff0c;初始化当前目录成为git仓库…

LeetCode讲解篇之216. 组合总和 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 使用递归回溯算法&#xff0c;当选择数字num后&#xff0c;在去选择大于num的合法数字&#xff0c;计算过程中的数字和&#xff0c;直到选择了k次&#xff0c;如果数组和等于n则加入结果集 从1开始选择数字&#xff0c;直…

ubuntu 2022.04 安装vcs2018和verdi2018

主要参考网站朋友们的作业。 安装时参考&#xff1a; ubuntu18.04安装vcs、verdi2018_ubuntu安装vcs-CSDN博客https://blog.csdn.net/qq_24287711/article/details/130017583 编译时参考&#xff1a; 【ASIC】VCS报Error-[VCS_COM_UNE] Cannot find VCS compiler解决方法_e…

平凡之路_2023年

平凡之路总结 思路总结&#xff0c;以XMIND 为形式&#xff0c;构建思维大厦&#xff0c;蛰伏与积累&#xff0c;下面补充对XMIND的描述 内功修炼问题意识&#xff08;输入&#xff09;与结构化思维&#xff08;输出&#xff09; – 同如何成为一个领域的专家 2024.1.14 最大的…

VCG 基于连通性网格面片聚类

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的思路其实与点云的欧式聚类非常类似,区别在于点云的欧式聚类是通过搜索半径对点云进行聚类,至于基于连通性网格面片聚类则是通过面片的邻近关系对面片进行聚类,大致的过程与欧式聚类是相同的: 首先,需要指…

ant design vue createFromIconfontCN中的scriptUrl引入本地文件方案

背景说明&#xff1a;本项目使用vue 3&#xff0c;ant design vue v5&#xff0c;vite 构建。 本篇博客实现ant design vue中提供的createFromIconfontCN方法引入本地文件的方案。 官方文档如下&#xff1a; import { createFromIconfontCN } from ant-design/icons-vue; imp…

编程探秘:Python深渊之旅-----更高的山峰(结语)

项目终于成功上线&#xff0c;团队聚集在一起&#xff0c;庆祝他们的辛勤工作和出色的成就。 龙&#xff08;兴奋地&#xff09;&#xff1a;我们做到了&#xff01;这是团队努力的成果&#xff0c;每个人都做出了巨大的贡献。 码娜&#xff08;笑着&#xff09;&#xff1a;…

统计学-R语言-4.4

文章目录 前言双变量数据分类型数据对分类型数据--二维表分类对分类--复式条形图分类对数值--并列箱线图 数值型数据对数值型数据散点图相关系数 练习 前言 上一篇文章介绍的是单变量数据&#xff0c;本篇将介绍双变量数据。 双变量数据 描述分类数据对分类数据的描述方法&am…

代码随想录算法训练营29期Day20|LeetCode 654,617,700,98

文档讲解&#xff1a;最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树 654.最大二叉树 题目链接&#xff1a;https://leetcode.cn/problems/maximum-binary-tree/description/ 思路&#xff1a; 本题目要求我们根据已知数组构建一颗最大二叉树&#xff0c;最大值…

(菜鸟自学)搭建虚拟渗透实验室——安装Kali Linux

安装Kali Linux Kali Linux 是一种基于 Debian 的专为渗透测试和网络安全应用而设计的开源操作系统。它提供了广泛的渗透测试工具和安全审计工具&#xff0c;使安全专业人员和黑客可以评估和增强网络的安全性。 安装KaliLinux可参考我的另一篇文章《Kali Linux的下载安装以及基…

SpringBoot默认日志输出格式

logback.xml <?xml version"1.0" encoding"UTF-8"?> <!-- 配置文件每隔1分钟&#xff0c;就检查更新 --> <configuration scan"true" scanPeriod"60 seconds" debug"false"><!--SpringBoot的三个自…

HTML之CSS Animation 属性常用动画

引入下面的样式表后 -webkit-animation: tada 1s ease 0.3s infinite both;-webkit-animation: name duration timing-function delay iteration_count directionanimation 各个参数详细用法请看 https://www.w3school.com.cn/css/css3_animations.aspcubic-bezier 生成器 http…

python统计分析——操作案例(模拟抽样)

参考资料&#xff1a;用python动手学统计学 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seaborn as snsdata_setpd.read_csv(r"C:\python统计学\3-4-1-fish_length_100000.csv")[length] #此处将文件路径改为自己的路…

数据结构(c)冒泡排序

本文除了最下面的代码是我写的&#xff0c;其余是网上抄写的。 冒泡排序 什么是冒泡排序&#xff1f; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交…

【5G Modem】5G modem架构介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…