【刷题笔记】第三天

【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

新手小白 必须精进的 “ FLASH分区管理Code and Data ” !!!最强文章解析!!!

FLASH“代码区”和“数据区”不是每个项目都必须显式管理,但只要你的产品功能越来越丰富,对可靠性和扩展性要求提高,就一定要学会科学划分和使用。这也是嵌入式工程师进阶路上的必修课!

qq_75157958的博客 933

刷题笔记(第三天)

你可以定义一个数组 归约后 的值,然后应用以下操作: 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

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 346

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

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

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

weixin_51462579的博客 331

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 604

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

文章目录第三天(双指针)移动零两数之和方法一(二分查找)方法二(双指针) 第三天(双指针) 移动零 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

手把手教你学Simulink——基于核能发电系统的场景实例:核电站汽轮机与发电机协调控制仿真

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

MHD0815的博客 212

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

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

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

2301_81189772的博客 242

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+

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

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

weixin_45615071的博客 185

【AUTOSAR-E2E】-2.2-配置E2E:基于E2EPW配置一个TX发送的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> &lt.

「汽车电子助手」的博客 4218

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

weixin_30252709的博客 446

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

offer收割机!

Jack-Cui 7942

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

看完谷歌大佬的刷题笔记, 我直接手撕了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、付费专栏及课程。

余额充值