【LeetCode每日一题】2024年8月第二周(上)

 2024.8.5 困难

链接:600. 不含连续1的非负整数

(1)题目描述:

(2)示例

(3)分析

思路1:

        题目要求的数值,是将数二进制转换后,不存在连续的1,那么我们初步分析:每一个数的最高位,由下一位来决定。第二位为0时:下一位可为0、1;而第二位为1时:下一位只为0

        于是直接进行转换,按照n转换为2进制的位数后的长度,进行递归拼接即可。最后统计,只要转换后的数字,小于等于n就行。

        这种方法,虽然可行,但在10^9数据量面前,显然不够看的,运行n=10^9时,耗时5s。

思路2:

        因为实际上控制大小的是n转换为2进制后的长度,我们去观察,不同长度下,它的最大结果。(即当前长度下,所包含的个数)

        ① 我们惊人的发现,他们的结果满足类似斐波那契数列的特点,因此我们完全可以写写出长度和个数的方程:dp[i] = dp[i - 1] + dp[i - 2]; (dp用于存储个数,i为n二进制长度)

        ② 而进一步发现,我们可以得到:只要当前i位(从0开始)为1,那么结果中就一定包含:dp[i]个值:

        怎么理解?

        1)我们将dp结果看作是:i位1的数总和,比如符合题目可存在的最大数 101010(含自身)-- 6位 和1000000(不含自身) 皆对应 d[6]=d[5]+d[4] ==》d4=d3+d2 d2=d1+d0 =d1+1

       2) 而实际上d[6],同时满足:d[6]=d[5]+d[3]+d[2]=d[5]+d[3]+d[1]+1 ,很显然,这是和101010的1所在位数对应的,

        3)那么对101001 6位:拆分为:100000 + 001000+ 000001 首先包含5位情况下的所有个数,再比对1000,再比对1==》100000:dp[5] 001000:dp[3] 000001:dp[0]

        于是乎,我们得到:可以直接由当前n的二进制转换,得到最终的结果!

        

(4)代码

我把两种都写上:

//思路2:
class Solution {// 动态规划的方法计算不含连续 1 的二进制数的数量public static int findIntegers(int n) {int[] dp = new int[32];//32位,最大n在此范围内dp[0] = 1;//初始化数据dp[1] = 2;// 预处理 dp 数组for (int i = 2; i < 32; i++) {dp[i] = dp[i - 1] + dp[i - 2]; //结果满足类似斐波那契数列的形式}int temp = 0;//检测最终值是否为2个1的情况int result = 0;//由上文遍历的思路,如此可以确定,只要当前i位为1,那么结果中就一定包含:dp[i]个前一位的东西// 怎么理解://将dp结果看作是:i位1的数总和,比如可存在的最大数 101010(含自身) 6位 和1000000(不含自身) 皆对应d[6]=d[5]+d[4] ==》d4=d3+d2 d2=d1+d0 =d1+1// 而实际上d[6],同时满足:d[6]=d[5]+d[3]+d[2]=d[5]+d[3]+d[1]+1 ,很显然,这是和101010的1所在位数对应的,// 那么对101001 6位:拆分为:100000 + 001000+ 000001 首先包含5位情况下的所有个数,再比对1000,再比对1==》// 100000:dp[5] 001000:dp[3] 000001:dp[0]// 遍历 n 的二进制表示for (int i = 31; i >= 0; i--) {if ((n & (1 << i)) != 0) {  // 当前位是 1按照上文输出// 实际上类如:11000 和10101相互等价皆为d[4]+d[3],所以不用else了……result += dp[i];if (temp == 1) {  // 检测到连续的两个 1return result;}temp = 1;} else {temp = 0;}}return result + 1;  // 包含 n 本身}// 测试public static void main(String[] args) {long start = System.currentTimeMillis();int sum = findIntegers(1000000000);System.out.println(sum);System.out.println("time: " + (System.currentTimeMillis() - start) + "ms");}
}
//思路1:
class Solution1 {//遍历,直接超时!//思路:没有连续的1,那么每一个数的最高位:由下一位来决定。第二位为0时:可为0、1;1时:只为0.//统计时,只要大小小于就行。public static int findIntegers(int n) {int sum = 0;int len = Integer.toBinaryString(n).length();//Integer.toBinaryString:2进制转换List<String> str = Arrays.asList("0", "1");//赋初值if (n < 2) return n + 1;else {for (int i = 0; i < len; i++) {str = getS(str);}List<String> re = str.stream().sorted().filter(s -> n >= Integer.valueOf(s, 2)).collect(Collectors.toList()); sum = re.size();}return sum;}public static List<String> getS(List<String> str) {List<String> stringList = new ArrayList<>();str.stream().forEach(s -> {if (s.charAt(0) == '0') {stringList.add("0" + s);stringList.add("1" + s);} else {stringList.add("0" + s);}});return stringList;}public static void main(String[] args) {long start = System.currentTimeMillis();int sum = findIntegers(100000000);System.out.println(sum);System.out.println("time: " + (System.currentTimeMillis() - start) + "ms");}
}

(5)碎碎念

题目越短,事儿越大……一个题看了挺久的

 2024.8.06 中等

链接:3129. 找出所有稳定的二进制数组 I

(1)题目描述:

(2)示例

(3)分析

        题目中,limit限制着0或1的最大连续出现次数(最大为limit),我们按照顺序放0、1时,最后一位0/1是由:前一位没达到limit限制0、1添加0/1而来,转换为可以计算的,便是:不受限制(即所有)的0、1,减去不符合要求的(出现次数大于limit的。)

        于是我们捋清楚了思路,而超过限制的明显由0或1组成,因此我们分类来讨论:

        ① 0结尾的:sum0 = 放0前以0/1结尾的总和  -  前面放了limit+1个0,以1结尾的

        ② 1结尾的:sum1 = 放1前以0/1结尾的总和  -  前面放了limit+1个1,以0结尾的

        最后结果,sum1 sum0

        而此皆存在一个前提,当前放入的0/1总数,大于limit,如此才可能有重合。因此需要来表示当前存入的0/1数量==》

        于是乎,大致思路有了,整体运用动态规划,设置i用于表示当前存入0的数量,j表示存入1的数量。再次观看案例,考虑到可能存在只放入同一个值(同时不超过limit和个数),其结果只有一种情况,由此可以设定初始值。

        贴一张官方图:

(4)代码

class Solution {public int numberOfStableArrays(int zero, int one, int limit) {final long MOD = 1000000007;long[][][] dp = new long[zero + 1][one + 1][2];for (int i = 0; i <= Math.min(zero, limit); i++) {// 初始化,设置最基础的可能性,只填充同一个值时,只有一种情况。赋值1;dp[i][0][0] = 1;}for (int i = 0; i <= Math.min(one, limit); i++) {dp[0][i][1] = 1;}for (int i = 1; i <= zero; i++) {for (int j = 1; j <= one; j++) {if (i > limit) {dp[i][j][0] = dp[i - 1][j][0] + dp[i - 1][j][1] - dp[i - limit - 1][j][1];} else {dp[i][j][0] = dp[i - 1][j][0] + dp[i - 1][j][1];}// dp[i][j][0]%= MOD;不这样写是因为,数据量大了后,会溢出,对应的数据变成负数了……dp[i][j][0] = (dp[i][j][0] % MOD + MOD) % MOD;// 数据回正if (j > limit) {dp[i][j][1] = dp[i][j - 1][0] + dp[i][j - 1][1] - dp[i][j - limit - 1][0];} else {dp[i][j][1] = dp[i][j - 1][0] + dp[i][j - 1][1];}dp[i][j][1] = (dp[i][j][1] % MOD + MOD) % MOD;}}return (int) ((dp[zero][one][0] + dp[zero][one][1]) % MOD);}
}

(5)碎碎念

你管这叫中等题?一开始我想的是用组合和乘法原理的思想,希望得到一个通解公式,类似那种伯努利装错信的思想,后来发现得不到有效的思路……还是太菜了。然后看了题解的提示,才有的思路。

 2024.8.07 困难

链接:3130. 找出所有稳定的二进制数组 II

(1)题目描述:

(2)示例

(3)分析

        这题目,实际上就是上面的,只不过数据量变大了,但是咱们的思路是完全正确的,而且取模后数据也不会超,直接试一试就行。Ctrl c v。

        这里放一个灵神的解析,采用:容斥原理+乘法原理 ,我一开始的思想就类似这个,但没求出来,看到解析发现本来思路的可行性,灵神nb!

 灵茶山艾府解析 - 力扣(LeetCode)

(4)代码

. - 力扣(LeetCode) 贴个代码。

class Solution {private static final int MOD = 1_000_000_007;private static final int MX = 1001;private static final long[] F = new long[MX]; // f[i] = i!private static final long[] INV_F = new long[MX]; // inv_f[i] = i!^-1static {F[0] = 1;for (int i = 1; i < MX; i++) {F[i] = F[i - 1] * i % MOD;}INV_F[MX - 1] = pow(F[MX - 1], MOD - 2);for (int i = MX - 1; i > 0; i--) {INV_F[i - 1] = INV_F[i] * i % MOD;}}public int numberOfStableArrays(int zero, int one, int limit) {if (zero > one) {// swap,保证空间复杂度为 O(min(zero, one))int t = zero;zero = one;one = t;}long[] f0 = new long[zero + 3];for (int i = (zero - 1) / limit + 1; i <= zero; i++) {f0[i] = comb(zero - 1, i - 1);for (int j = 1; j <= (zero - i) / limit; j++) {f0[i] = (f0[i] + (1 - j % 2 * 2) * comb(i, j) * comb(zero - j * limit - 1, i - 1)) % MOD;}}long ans = 0;for (int i = (one - 1) / limit + 1; i <= Math.min(one, zero + 1); i++) {long f1 = comb(one - 1, i - 1);for (int j = 1; j <= (one - i) / limit; j++) {f1 = (f1 + (1 - j % 2 * 2) * comb(i, j) * comb(one - j * limit - 1, i - 1)) % MOD;}ans = (ans + (f0[i - 1] + f0[i] * 2 + f0[i + 1]) * f1) % MOD;}return (int) ((ans + MOD) % MOD); // 保证结果非负}private long comb(int n, int m) {return F[n] * INV_F[m] % MOD * INV_F[n - m] % MOD;}private static long pow(long x, int n) {long res = 1;for (; n > 0; n /= 2) {if (n % 2 > 0) {res = res * x % MOD;}x = x * x % MOD;}return res;}
}//作者:灵茶山艾府
//链接:https://leetcode.cn/problems/find-all-possible-stable-binary-arrays-ii/solutions/2758868/dong-tai-gui-hua-cong-ji-yi-hua-sou-suo-37jdi/
//来源:力扣(LeetCode)
//著作权归作者所有。非商业转载。

(5)碎碎念

今天早上,在地铁上打开Leetcode app,发现题目和昨天一样,直接在手机上写了,正好检测昨天的记忆,写完正好地铁到站,案例也过了,虽然运行时间和内存排名排不到前面罢了。

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

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

相关文章

SQL时间盲注

目录 1.时间盲注 2使用场景 3.步骤 3.1判断注入点 3.2爆数据库名 3.3爆表名 3.4爆字段名 3.5查询数据 1.时间盲注 时间盲注是指基于时间的盲注&#xff0c;也叫延时注入&#xff0c;根据页面的响应时间来判断是否存在注入。 2使用场景 页面没有回显位置&#xff08;…

安装Supervisor队列进程、管理 Laravel 队列进程

在 CentOS 上安装 Supervisor 并配置 Laravel 的步骤如下&#xff1a; 1.安装 Supervisor&#xff1a; 使用以下命令安装 Supervisor&#xff1a; sudo yum install epel-release sudo yum install supervisor 2.配置 Supervisor&#xff1a; 创建一个新的 Supervisor 配置文…

EasyBoss ERP订单分仓规则优化升级,帮助跨境卖家高效处理TikTok本土店订单

做TikTok本土小店不仅要上货快&#xff0c;订单处理效率也得快&#xff01;效率越高&#xff0c;赚钱的速度就比别人要快&#xff01; 想提高订单效率&#xff0c;少不了EasyBoss ERP的帮忙&#xff0c;最近EasyBoss订单处理模块又有新升级&#xff0c;让老板们体验“快到飞起…

给新手项目经理的几点建议

踏入项目管理的新领域&#xff0c;对于每一位新手项目经理而言&#xff0c;都是一次既激动又充满挑战的旅程。在这个过程中&#xff0c;不仅需要掌握扎实的理论知识&#xff0c;还需要在实践中不断积累经验&#xff0c;提升自我。以下是一些针对新手项目经理的实用建议&#xf…

Stable Diffusion绘画 | 图生图-上传重绘蒙版

上传重绘蒙版&#xff0c;可以弥补局部重绘的缺点&#xff0c;能够更精细的修改画面中的指定区域 使用PS制作的蒙版图片为耳朵下方区域&#xff0c;可以为图片中的女生带上不同款式的耳环。 参数配置&#xff1a; 调整提示词&#xff1a; 生成图片如下所示&#xff1a; 调整提…

大数据面试SQL(一):合并日期重叠的活动

文章目录 合并日期重叠的活动 一、题目 二、分析 三、SQL实战 四、样例数据参考 合并日期重叠的活动 一、题目 已知有表记录了每个品牌的活动开始日期和结束日期&#xff0c;每个品牌可以有多个活动。请编写一个SQL查询合并在同一个品牌举行的所有重叠的活动&#xff0c…

手机在网时长查询接口如何对接?(一)

一、什么是手机在网时长查询接口&#xff1f; 传入手机号码&#xff0c;查询该手机号的在网时长&#xff0c;返回时间区间&#xff0c;支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景&#xff1f; 例如&#xff1a;客户画像与精准营销 &#xff08;1&…

ROS 7上实现私网互通方案

一、背景: 第一个私网现状:连接公域网是由tp-link进行拨号链接使用动态公网ip,内部网段是192.168.1.0/24 第二个私网现状:连接公域网是机房的固定公网ip,内部网段为10.0.0.0/16二、目标 安全的打通192.168.1.0/24和10.0.0.0/16的网络, 使得前者局域网中的机器能够安全访…

C#使用Socket实现TCP服务器端

1、TCP服务器实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks;namespace PtLib.TcpServer {public delegate void Tcp…

浏览器渲染树的形成原理,你真的懂吗?

一、浏览器渲染的基本流程 解析 HTML 当用户在浏览器中输入网址或点击链接时&#xff0c;浏览器会向服务器发送请求获取 HTML 文件。随后&#xff0c;浏览器开始解析 HTML 代码&#xff0c;将其转化为一系列的标签和文本&#xff0c;并构建出 DOM 树。这棵树以层次结构表示了网…

Tensorflow预训练模型转PyTorch

深度学习领域是计算机科学中变化最快的领域之一。大约 5 年前&#xff0c;当我开始研究这个主题时&#xff0c;TensorFlow 被认为是主导框架。如今&#xff0c;大多数研究人员已经转向 PyTorch。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/…

无人机无线电监测设备技术分析

随着无人机技术的飞速发展&#xff0c;其在民用、军事、科研及娱乐等领域的广泛应用&#xff0c;对无线电频谱资源的有效管理和监测提出了更高要求。无人机无线电监测设备作为保障空域安全、维护无线电秩序的重要工具&#xff0c;集成了高精度定位、频谱扫描、信号分析、数据处…

《Token-Label Alignment for Vision Transformers》ICCV2023

摘要 这篇论文探讨了数据混合策略&#xff08;例如CutMix&#xff09;在提高卷积神经网络&#xff08;CNNs&#xff09;性能方面的有效性&#xff0c;并指出这些策略在视觉Transformer&#xff08;ViTs&#xff09;上同样有效。然而&#xff0c;发现了一个“token fluctuation…

Axure RP界面设计初探:基础操作与实用技巧

Axure RP是目前流行的设计精美的用户界面和交互软件。Axure RP提供了一组丰富的RP。 UI 控件&#xff0c;这些控件根据它们的应用领域进行分类。作为Axure的国产替代品&#xff0c;它可以在线协同工作&#xff0c;浏览器可以在不下载客户端的情况下立即打开和使用。如果以前用A…

OpenCV专栏介绍

在当今人工智能和计算机视觉领域&#xff0c;OpenCV作为一个功能强大的开源库&#xff0c;已经成为实现各种视觉算法的基石。本“OpenCV”专栏致力于帮助读者深入理解并掌握OpenCV的使用&#xff0c;从而在计算机视觉项目中发挥关键作用。 专栏导读 随着技术的不断进步&#…

e6.利用 docker 快速部署自动化运维平台

利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…

Java程序员接单分享

作为一名Java程序员&#xff0c;这阵子通过承接些小型项目&#xff0c;我顺利跨过了月薪破万的门槛。这些项目虽小&#xff0c;却如同磨刀石般&#xff0c;让我在实战中发现了自身技术栈的棱角与不足&#xff0c;尤其是意识到了在Java这一浩瀚技术海洋中的诸多未知领域。我深知…

pytorch和deep learning技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题&#xff0c;小虎单独收集到这里。 torch.hub.load how does it work 下载预训练模型再载入&#xff0c;用程序下载链接可能失效。 model torch.hub.load(ultralytics/yolov5, yolov5s)model torch.hub.load(ultralytics/y…

WPF学习(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…

我的cesium for UE踩坑之旅(蓝图、UI创建)

我的小小历程 过程创建对应目录&#xff0c;并将要用到的图片、资源放入对应目录下内容浏览器 窗口中右键&#xff0c;创建一个控件蓝图&#xff0c;用来编辑界面UI绘制画布面板&#xff08;canvas&#xff09;调整整体布局加入对应的控件将UI加入到关卡中 备注搜索不到 Add To…