【刷题笔记】第三天

【LeetCode & 剑指offer 刷题笔记】汇总(已完成) 前言   不知不觉就结束了自己的秋招之路,虽感觉有些艰辛但是收获很多。找工作那段时间做了很多学习笔记,这是数据结构与算法相关的一部分笔记,这一块除了复习相关教科书,还有就是刷leetcode和《剑指offer》了。这段时间稍微空闲些,打算把自己之前在印象笔记上做的笔记迁移到优快云上(优快云解析html源码的功能还没加上去,已经反馈了这个问题,我要再等等这个功能,免得要过多的二次编辑),供大家学... 阅读详情

两道简单题

2923. 找到冠军 I

方法1:
如果 i 是冠军,那么 grid[i][j] == 1, 其中j!=i
所以我们遍历grid的每一行,假设是第i行,只要除第i列外,其他位置的元素都是1,则 i 就是冠军。
除了判断每一行,也可以判断每一列,只要这一列的所有元素都为0,说明没有队伍可以战胜该队伍。

class Solution {
    public int findChampion(int[][] grid) {
        for (int i = 0; i < grid.length; ++i) {
            boolean flag = true; // 记录是否决出了冠军
            for (int j = 0; j < grid[i].length; ++j) {
                if (j != i && grid[i][j] == 0) {
                    flag = false; // j比i强,i不可能是冠军
                    break;
                }
            }
            if (flag) {
                return i;
            }
        }
        return -1;
    }
}

时间复杂度 O ( n 2 ) O(n^2) O(n2)

方法2:擂主争霸

class Solution {
    public int findChampion(int[][] grid) {
        int champinon = 0; // 假设0是冠军
        int index = 1;
        int n = grid.length;
        while (index < n) {
            if (grid[index][champinon] == 1) {
                // index比champinon,所以冠军变为index
                champinon = index;
            }
            // 冠军变了,为什么index不需要从0开始?
            // 因为在1~index - 1都不能战胜原来的冠军,当然更战胜不了当前的冠军(当前的冠军战胜了原来的冠军)
            index++;
        }
        return champinon;
    }
}

时间复杂度 O(n)

3095. 或值至少 K 的最短子数组 I

3097. 或值至少为 K 的最短子数组 II
两道题区别只是数据规模不同

方法1:
暴力枚举每一个子数组

class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; ++i) {
            int res = 0;
            for (int j = i; j < nums.length; ++j) {
                res |= nums[j];
                if (res >= k) {
                    ans = Math.min(ans, j - i + 1);
                    break;
                }
            }
        }
        return ans == Integer.MAX_VALUE ? -1 : ans;
    }
}

方法2:
遇到到子数组考虑以i结尾的子数组……
或的性质:越或,值越大或者不变,肯定不能变小。
考虑以i结尾的子数组,当i-1结尾的子数组的或值 |nums[i] ,就是i结尾的子数组的或值。
为了计算最短子数组的长度,在保存或值的同时,记录该或值对应的左端点位置。如果遇到相同的或值,就保留最大的左端点。

还有一些coding细节,例如如何利用一个list,动态的更新当前子数组的或值,下面代码用到了双指针思想。

class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        // list中的元素按照左端点位置从小到大排序
        List<int[]> list = new ArrayList<>();// 保存以i结尾的子数组的{or值,对应的最大左端点}
        int n = nums.length;
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < n; ++i) {
            list.add(new int[]{0, i}); // 先占个位,不参与或运算
            // 此时,list是以i-1结尾的子数组的or值及其左端点位置
            int l = 0, r = 0;
            // 将list中的元素或上nums[i]
            for (; r < list.size(); ++r) {
                int[] cur = list.get(r);
                cur[0] |= nums[i];
                if (cur[0] >= k) {
                    // 满足条件就收集结果
                    ans = Math.min(ans, i - cur[1] + 1);
                }
                if (cur[0] == list.get(l)[0]) {
                    // 有重复值,保留左端点最大的
                    list.get(l)[1] = cur[1]; // 左端点更新为最大的
                } else {
                    list.set(++l, cur); // 将l+1位置覆盖
                }
            }
            // 以i结尾的子数组对应的或值,其实是[0, l]范围,l之后的元素需要删除
            list.subList(l + 1, list.size()).clear();
        }
        return ans == Integer.MAX_VALUE ? -1 : ans;
    }
}

优化:list.subList(l + 1, list.size()).clear();这一行代码其实是比较耗时的,其实可以用一个变量记录有效值的长度。用二维数组保存子数组的或值和左端点位置

二维数组优化

class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        // 为什么只需要开32长度的二维数组?
        // 注意题目中说了nums中的元素最大位
        int[][] list = new int[32][2]; // list[i][0]表示或值,list[i][1]表示对应的左端点位置
        int len = 0; // 记录list中的有效值
        int n = nums.length;
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < n; ++i) {
        	list[len][0] = 0;
            list[len++] = i;
            int l = 0, r = 0;
            for (; r < len; ++r) {
                int[] cur = list[r];
                cur[0] |= nums[i];
                if (cur[0] >= k) {
                    ans = Math.min(ans, i - cur[1] + 1);
                }
                if (cur[0] == list[l][0]) {
                    list[l][1] = cur[1]; // 重复值
                } else {
                    list[++l][0] = cur[0];
                    list[l][1] = cur[1];
                }
            }
            len = l + 1; // 更新有效值的长度
        }
        return ans == Integer.MAX_VALUE ? -1 : ans;

    }
}

为什么只需要开辟32长度的二维数组?
nums[i] <= 1 0 9 10^9 109,而 2 29 < 1 0 9 < 2 30 2^{29} < 10^9<2^{30} 229<109<230,假设nums[i] = 1 0 9 10^9 109,其二进制位数也就31位。
由于或操作,可以使一位或者多位由0变为1,所以或值最多也就有31种,所以开辟32长度的二维数组,足以保存所有的或值。

真的神了~无意中发现1500道的2021LeetCode算法刷题pdf笔记 昨晚逛GitHub,无意中看到一位大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。 关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷力扣算法题后整理的上千道题,每道题均附有详细题解过程。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏安利。 累计1500+道...拿来即刷!word很大,你忍一下,我就不一一截图了,诸君自行下载哈。 可以看到,每道题的原题,题目大意,解题思路,以及代码实现都非常 阅读详情

相关推荐

师兄刷题笔记、算法小抄、面试突击版必备资源,帮你走上人生巅峰

前言 最近有很多朋友问我刷题、面试有没有什么好的资源。今天就给大家找了三个棒的开源资源,内容非常硬核,很多人靠着它进了大厂。 不绕弯子,三个分别是谷歌师兄《谷歌大佬的刷题笔记》,东哥《labuladong的算法小抄》,Guide哥的《Java面试突击版》。三位大佬都是我很钦佩之人,他们把自己整理的东西开源分享,太赞了,我这边帮大家搜集到pdf版本可以直接观看。 本来想在csdn上上传资源大家可以直接下载的,但是版权问题不允许,那这些开源资源pdf文件只能通过百度云方式给大家分享了。 三份资源可以直接微信搜一

bigsai 7580

Leetcode 3097. Shortest Subarray With OR at Least K II

Leetcode 3097. Shortest Subarray With OR at Least K II

codename_cys的博客 620

Spyglass功耗分析:从RTL到优化的全流程实践

本文详细介绍了在RTL设计阶段使用Spyglass进行早期功耗分析的全流程实践。通过一个真实项目案例,阐述了早期功耗分析的必要性,并手把手指导了从文件准备、GUI操作到报告解读与优化的完整步骤。文章重点说明了如何利用Spyglass实现功耗分析的“左移”,在编码阶段识别和修复功耗热点,从而避免后期高昂的修改成本,是低功耗芯片设计的关键技能。

purple的博客 1115

刷题笔记(第三天)

你可以定义一个数组 归约后 的值,然后应用以下操作: val = fn(init, nums[0]) , val = fn(val, nums[1]) , val = fn(val, nums[2]) ,... 直到数组中的每个元素都被处理完毕。这个 counter 函数最初返回 n,每次调用它时会返回前一个值加 1 的值 ( n , n + 1 , n + 2 ,等等)。4.请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素。

m0_62508027的博客 271

全双工AI语音交互:从原理到实践,构建实时对话系统

语音交互技术正从传统的半双工模式向全双工模式演进,以实现更自然、实时的对话体验。全双工交互的核心原理在于模拟人类电话通话,允许双方同时发送和接收音频流,这需要流式语音识别(Streaming ASR)和实时自然语言理解(Real-time NLU)技术的深度整合。其技术价值在于显著降低交互延迟,支持智能打断(Barge-in),从而提升人机对话的流畅度和自然度。在应用场景上,全双工技术是智能助手、实时翻译、车载语音及无障碍交互等领域的关键突破。本文以微软MAI Realtime等模型为例,探讨如何利用开源技

weixin_33693070的博客 404

MacBook 本地化部署 Dify 指南

dify 怎么安装部署 有哪些坑 !

weixin_44542598的博客 1522

嵌入式软件刷题笔记【第三天】

嵌入式软件工程师面试高频知识点合集【三】

weixin_51462579的博客 331

TCS34725颜色识别模块实战调校:从“一坨”例程到精准RGB

本文针对TCS34725颜色识别模块初始数据不准的问题,提供了从基础例程到精准调校的实战指南。核心在于通过白光校正与黑白光校正两种方法,补偿传感器偏差与环境光影响,将原始数据准确映射为标准RGB值。文章详细阐述了校准原理、操作步骤与代码实现,并分享了进阶调试技巧与避坑指南,帮助开发者显著提升颜色识别的准确性与项目可靠性。

weixin_29188043的博客 288

刷题第三天(跑路人笔记)<双指针>

文章目录第三天(双指针)移动零两数之和方法一(二分查找)方法二(双指针) 第三天(双指针) 移动零 283. 移动零 - 力扣(LeetCode) 使用快慢两指针, 慢指针每当快指针找到非零内容时两者数值进行交换慢指针后移,我们的快指针遍历完数值即可结束. void Swap(int*a ,int* b) { int tmp = *a; *a = *b; *b = tmp; } void moveZeroes(int* nums, int numsSize) { int f

qq_61434711的博客 251

手把手教你用Boot-Repair快速修复Ubuntu启动分区缺失(附详细命令行步骤)

本文详细介绍了如何使用Boot-Repair工具快速修复Ubuntu启动分区缺失问题,包括诊断、应急准备、自动修复和手动命令操作。通过grub rescue模式下的关键命令和Boot-Repair的图形界面操作,帮助用户高效解决启动分区故障,确保系统恢复正常运行。

weixin_29229989的博客 563

Cadence17.4 Allegro PCB制板(gerber / 光绘)文件输出的顺序及注意点

Cadence Allegro PCB制板文件输出 (gerber 光绘文件输出)

weixin_45331044的博客 1万+

LeetCode热题100 刷题笔记(第三天)链表 「两数相加」

本文分享了用Java解决链表数字相加问题的代码实现。通过创建哑节点简化边界处理,使用temp变量记录进位值,循环遍历两个链表节点进行逐位相加。关键点包括:1)哑节点避免单独处理头节点;2)temp变量处理进位逻辑(%10取当前位,/10更新进位);3)循环条件确保完全遍历链表并处理最后进位。附有链表节点结构定义和详细代码注释,适合算法初学者理解链表操作和数学进位处理的结合应用。

2301_81189772的博客 242

Simulink中Simscape—Fluids模块(原Simhydraulics)学习记录

学习来源:http://cn.mathworks.com/help/physmod/hydro/getting-started-with-simhydraulics.html 主要学习内容如下图: 详细内容: 1、组件来源 SIMULINK浏览器中的模块:Simscape_Foundation 和 Simscape_Fluids。 2、Simscape下包括多个子

1万+

【第三天】LeetCode刷题笔记分享 | 容易篇 | 13罗马数字转整数

大家好,我是Cohen,叫这个名字的原因是我非常喜欢一个叫做莱昂纳德.科恩诗人。我是一名致力于学习编程的学生,因为想等到以后毕业有一个好的面试结果,所以最近将刷题提上了日程,,所以我打算从LeetCode简单的题目开始刷起,通过积累学习的方式,不断的提高自己的编程硬实力。我的个人公众号附在文章末位,感兴趣的朋友们,可以扫码关注,在公众号我会经常分享一些学习心得和学习资源。 文章目录题目信息1.1 题目的描述1.2 示例1.3 注意题解解题思路代码实现算法复杂度分析提交结果 题目信息 1.1 题目的描述 .

weixin_45615071的博客 185

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4566

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java面试3天冲刺攻略:高频考点+实战刷题+避坑指南

Java作为企业级应用开发的核心语言,其面试准备需要系统性的知识体系构建。从Java虚拟机内存模型到并发编程原理,理解底层机制是应对技术考察的基础。HashMap作为集合框架的关键组件,其数组+链表/红黑树结构、哈希冲突解决和扩容机制体现了数据结构的设计思想。在技术价值层面,掌握核心概念能够提升代码质量和系统性能,特别是在高并发场景下的线程安全问题处理。应用场景涵盖互联网企业的后端开发、金融系统的交易处理等需要稳定性和性能保障的领域。本文基于2026年面试趋势,整合HashMap原理和JVM调优等热词,提供

weixin_30252709的博客 446

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

聊聊刷题,让你事半功倍的编程笔记!

offer收割机!

Jack-Cui 7942

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

看完谷歌大佬的刷题笔记, 我直接手撕了101道 Leetcode 算法题

有了这份笔记,再也不愁搞不定 Leetcode

沉默王二 1万+

耗时3个月,近10W字的刷题笔记,多语言通吃,秒杀 80% Leetcode 题目!

学会了,offer收割机就是你~

Jack-Cui 1万+

刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版

优快云 的小伙伴们,大家好,我是爱学习爱分享的沉默王二。 迫不及待的小伙伴可以直接拖到文末,拉取离线版的下载地址,无套路无解压密码,我整理了将近一周的时间。 不经意间,在 GitHub 上发现了一个 1G 棒的 LeetCode 刷题笔记,重点来了,是纯正的 Java 版。我见过很多牛逼的刷题笔记,有 Go 版的,有 C++ 版的,唯独没有 Java 版的,所以这次,我感觉找到了宝藏! 其实私下里很多小伙伴问我有没有 Java 版的,一开始我觉得刷题嘛,用啥语言刷题根本不重要,重要的是解题的思路。但看到这

沉默王二 3万+

Github 疯传!史上最强!BAT 大佬「LeetCode刷题手册」电子书开放下载了!

优质资料

沉默王二 1万+

剑指Offer系列刷题笔记汇总

本文转自:个人网站:点击查看 一前言 二总结 链表-8道 二叉树12道 二叉搜索树3道 数组11道 字符串8道 栈3道 递归4道 回溯法2道 其他15道 一、前言 本系列文章为《剑指Offer》刷题笔记。 刷题平台:牛客网 书籍下载:共享资源 刷题刷的比较慢,花费了两个多月,终于将所有题目过了一遍,牛客网一共有66道题,这次刷题主要使用C++,接下来会使用Python...

Jack-Cui 5万+

LeetCode Java面试刷题笔记汇总

LeetCode Java刷题笔记汇总,按照类型刷题效率更高。

终生学习践行者 2948

中级软件设计师刷题笔记

中级软甲设计师笔记

zhanghanqmx的博客 9350

LeetCode刷题指南

力扣,作为一个国内外的程序员都用作准备面试的刷题网站,对想要阅读这篇指南的你应该都不陌生。当你想要借助力扣刷题,提升代码能力、在面试中脱颖而出,却不知从何入手,这篇文章可以作为你的入门指南。

airhaohan 的博客 8989

(刷题笔记)软考中级数据库 上午题

 计组在CPU中用于跟踪指令地址的寄存器是程序计数器(PC)。为实现程序指令的顺序执行,CPU程序计数器(PC)中的值将自动加1。程序计数器(PC)存放CPU下一条要执行的指令地址,在顺序执行程序中当其内容送到地址总线后会自动加1,指向下一条将要运行的指令地址;指令寄存器(IR)用于暂存正在执行的指令,地址寄存器(AR)用来保存当前CPU所访问的内存单元的地址。保存当前正在执行的一条指令,而指令一般包括操作码和地址码两部分,因此这两部分均存放在IR中。在CPU中,常用来为ALU执行算术逻辑运算提供

weixin_43143173的博客 1508
上一篇: 【刷题笔记】第二天
下一篇: 【刷题笔记】第四天
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值