LeetCodeHot100_0x02
LeetCodeHot100_0x02
11. 滑动窗口最大值(不熟)
求解思路: 暴力法的时间复杂度是O(NK),在K常数较大时复杂度就高了。所以我们要想办法将K优化掉,即本题的难点在于如何在O(1)的时间复杂度求出当前窗口中的最大值。这个特性会让我们想到 优先队列、双端队列
。但是什么是正确的入队规则,这里我独自想不出来。在理解题解过后,也能独自完成代码的编写了。
【暴力法】超出时间限制 40 / 51 个通过的测试用例
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {// 暴力法int n = nums.length;int[] res = new int[n-k+1];for(int i=0;i<n-k+1;i++) {int maxN = nums[i];for(int j=i;j<i+k;j++) {if(nums[j] > maxN) maxN = nums[j];}res[i] = maxN;}return res;}
}
【双端队列】优化获取最大值
- 入队原则:
- 时刻确保队首----队尾具有单调递减性
- 新元素入队时,从队尾开始比较,只要是小于等于的新元素的,没有机会成为最大值,我们可以直接将它出队列,然后将当前元素下标加入到队列的队尾
- 判断最大值是否还在窗口内,从队首开始,不断比较队首元素的下标和新加入元素下标的差是否比窗口长度大了,大了就把它出队列。
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {/**本题难点在于O(1)内获得窗口的最大值(思考数据结构:单调栈、堆)窗口的结构就和:双端队列是一样的利用双端队列完成这题:如何保证队列的单调性?1. 队头存储最大值,逐步递减2. 新元素入队时,从队尾开始逐个比较,比其小的全部淘汰【能力不如,年龄也不如,没机会】3. 队头元素如果离开了窗口范围,也淘汰掉【年龄大了,退休】如何确定队头元素离开了窗口范围呢?可以用队列存储下标信息,与当前新加入元素下标对比即可*/int n = nums.length;int[] res = new int[n-k+1];// 这个是双端队列的定义,存储元素下标Deque<Integer> dqIdx = new LinkedList<>();for(int i=0;i<k;i++) {// 新元素入队,从队尾逐个比较,把“又弱又老”的元素给删除【两步动作,先比较,后入队】//1. 比较(如果队列为空就不用比较了)while(!dqIdx.isEmpty() && nums[i] >= nums[dqIdx.getLast()]) dqIdx.removeLast();//2. 新元素入队dqIdx.addLast(i);}res[0] = nums[dqIdx.getFirst()]; // 第一个窗口的最大值出来了for(int i=k;i<n;i++) {// 新元素入队,从队尾逐个比较,把“又弱又老”的元素给删除【两步动作,先比较,后入队】//1. 比较(如果队列为空就不用比较了)while(!dqIdx.isEmpty() && nums[i] >= nums[dqIdx.getLast()]) dqIdx.removeLast();//2. 新元素入队dqIdx.addLast(i);//3. 判断最大值有没有超出窗口【下标是否大于k】while(i - dqIdx.getFirst() >= k) dqIdx.removeFirst();//4. 当前窗口的最大值res[i-k+1] = nums[dqIdx.getFirst()];}return res;}
}
复习: 双端队列Deque的用法
Java中的
Deque
(双端队列)是一种支持在队列两端插入和删除元素的数据结构。它既可用作先进先出(FIFO)的队列,也可用作后进先出(LIFO)的栈。以下是其核心用法和常用方法的详细介绍:
1. Deque 概述
- 接口定义:
java.util.Deque
,继承自Queue
接口。 - 核心特性:允许在队头和队尾高效插入、删除和查看元素。
- 实现类:
ArrayDeque
:基于动态数组实现,性能高效,推荐大多数场景使用。LinkedList
:基于链表实现,支持快速两端操作,同时实现了List
接口。
- 用途:
- 替代
Stack
类(官方推荐使用Deque
实现栈,因Stack
是同步的且设计老旧)。 - 实现普通队列、双端队列或循环队列。
- 替代
2. 常用方法
Deque的方法分为两类:操作失败时抛出异常或返回特殊值(如null
/false
)。
操作 | 抛出异常的方法 | 返回特殊值的方法 |
---|---|---|
插入队头 | addFirst(e) | offerFirst(e) |
插入队尾 | addLast(e) | offerLast(e) |
移除队头 | removeFirst() | pollFirst() |
移除队尾 | removeLast() | pollLast() |
查看队头 | getFirst() | peekFirst() |
查看队尾 | getLast() | peekLast() |
队列操作(FIFO)
- 入队:
add(e)
(等价于addLast(e)
)或offer(e)
(等价于offerLast(e)
)。 - 出队:
remove()
(等价于removeFirst()
)或poll()
(等价于pollFirst()
)。 - 查看队头:
element()
(等价于getFirst()
)或peek()
(等价于peekFirst()
)。
栈操作(LIFO)
- 入栈:
push(e)
(等价于addFirst(e)
)。 - 出栈:
pop()
(等价于removeFirst()
)。 - 查看栈顶:
peek()
(等价于peekFirst()
)。
3. 实现类选择
ArrayDeque
:- 默认选择,内存连续,访问高效。
- 初始容量为16,自动扩容,适合大多数场景。
LinkedList
:- 支持
List
操作,可在中间插入/删除(但性能较差)。 - 每个元素需额外内存存储节点,适合频繁的两端操作。
- 支持
4. 示例代码
作为栈使用
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1); // 栈顶插入
stack.push(2);
int top = stack.pop(); // 返回2(栈顶元素)
作为队列使用
Deque<Integer> queue = new ArrayDeque<>();
queue.offer(1); // 队尾插入
queue.offer(2);
int first = queue.poll(); // 返回1(队头元素)
双端操作
Deque<String> deque = new LinkedList<>();
deque.offerFirst("A"); // 队头插入
deque.offerLast("B"); // 队尾插入
String head = deque.pollFirst(); // "A"
String tail = deque.pollLast(); // "B"
5. 注意事项
- 线程安全:
ArrayDeque
和LinkedList
非线程安全,多线程环境下需使用Collections.synchronizedDeque
或并发容器。 - 空值处理:
LinkedList
允许插入null
,而ArrayDeque
会抛出NullPointerException
。 - 性能考量:频繁的随机访问选择
ArrayDeque
,频繁插入删除两端且需灵活性时选择LinkedList
。
12. 最小覆盖子串(不会)
求解思路: 尝试使用哈希法进行求解,最后写出来超时了,证明单纯的双循环还是不能解决问题,需要思考如何进行优化。
【暴力 哈希法】超出时间限制 265 / 268 个通过的测试用例
这段代码写的比较冗杂,比如判断大小写可以抽取、当前长度currlen可有可无,不过超时代码就不改了。就当是记录做题的一个草稿过程。
class Solution {public String minWindow(String s, String t) {/** 哈希模拟选择过程两层循环,第一层循环枚举符合的子串开头包含目标子串的字符才能作为开头,否则不可能最优(因为一定能存在更短的)第二层循环开始消耗目标子串值(哈希),直到匹配成功,判断当前长度*/int n = s.length();int m = t.length();int[] Tcnt = new int[52]; // 大写字母0-25,小写字母26-51if(m > n) return "";// 进行统计int minLen = n + m;String res = "";for(int i=0;i<m;i++) {if(t.charAt(i) >='A' && t.charAt(i) <='Z') {Tcnt[t.charAt(i)-'A'] ++;}else{Tcnt[t.charAt(i)-'a'+26] ++;} }for(int i=0;i<n;i++) {int p = 0; // 当前字母(子串的开始)对应的哈希下标int cnt = m; // 当前需要匹配的字符数(为0证明该子串包含了目标子串)int currLen = 0; // 当前子串长度if(s.charAt(i)>='A' && s.charAt(i)<='Z'){p = s.charAt(i)-'A'; }else {p = s.charAt(i)-'a' + 26;}if(Tcnt[p]<=0) continue; // 开头不是目标子串的字符,直接passint[] CopyT = (int[])Arrays.copyOf(Tcnt,52); // 复制原数组for(int j=i;j<n;j++) { // 从当前字母开始currLen++; int k = 0; // 当前枚举到的字符if(s.charAt(j)>='A' && s.charAt(j)<='Z'){k = s.charAt(j)-'A';}else {k = s.charAt(j)-'a' + 26;}if(CopyT[k] > 0) { // 如果是目标子串,认为是有效的CopyT[k] --;cnt-=1;}if(cnt==0 && minLen > currLen) { res = s.substring(i,j+1);minLen = currLen;}}}return res;}
}
【滑动窗口法】仍然是使用哈希存储字符组成,然后利用双指针维护窗口,先向右扩展,直到窗口内字符包含目标子串,接着向右缩小窗口,直到长度最小可满足的位置,记录这个时候的是否需要更新答案,循环下去即可。滑动窗口相比上面的暴力法,减少了很多重复枚举,因此可以通过,但特别抽象。我暂时只是看题解理解了,但是还是很难写出来。
class Solution {public String minWindow(String s, String t) {//1. 边界值处理if (s == null || s.isEmpty() || t == null || t.isEmpty() || s.length() < t.length()) return "";// 定义哈希表,记录字符组成Map<Character, Integer> Tcnt = new HashMap<>();Map<Character, Integer> Scnt = new HashMap<>();int n = s.length();int m = t.length();// 初始化Tcntfor(int i=0;i<m;i++) {char c = t.charAt(i);Tcnt.put(c,Tcnt.getOrDefault(c,0) + 1);}int left = 0, right = 0; // 窗口指针int cnt = 0; // 已经匹配上的字符数量int start = 0, minLen = n + m; // 最小窗口的起始位置和当前最短符合条件的子串长度// 开始while (right < s.length()) {//1. 向右扩展窗口char r = s.charAt(right);right++;// 更新if (Tcnt.containsKey(r)) { // 如果这个字符存在于Tcnt中,我们人为是有效的Scnt.put(r, Scnt.getOrDefault(r, 0) + 1); if (Scnt.get(r).equals(Tcnt.get(r))) cnt++;}//2. 向右减小窗口while (cnt == Tcnt.size()) {// 更新起始位置和长度if (right - left < minLen) {start = left;minLen = right - left;}// 获取字符char l = s.charAt(left);// 缩小窗口,移动左边界if (Tcnt.containsKey(l)) {Scnt.put(l, Scnt.get(l) - 1);if (Scnt.get(l) < Tcnt.get(l)) cnt--;}left++; // 继续缩小}}return minLen == n+m ? "" : s.substring(start, start + minLen);}}
13. 最大子数组和
求解思路: 这题要搞懂一个问题就行:正负抵消
我们在遍历的过程中,有正有负,只要当前连续和为正,那么这段连续和就还有意义。而如果出现了连续和为负的情况,说明前面这段完全没有价值了,何不重新开始。在这个过程中,不断记录遇到的连续和,其中的最大值就是答案。这个过程有点类似贪心(安逸版)
【贪心】
class Solution {public int maxSubArray(int[] nums) {// 动态规划int n = nums.length;int sum = 0;int res = -10000;for(int i=0;i<n;i++) {sum += nums[i]; res = Math.max(res,sum); // 更新最大值if(sum < 0) {sum = 0; // 发现贡献抵消,那么这里就没必要继续下去了,重来}}return res;}
}
14. 合并区间
求解思路: 这题就是区间合并模板题了,所谓区间合并,解题有两步骤:
- 对区间按照x坐标从小到大进行排序
- 遍历区间,用链表动态维护 rk. y 与 rk+1.x 【前一y坐标与后一x坐标大小关系】
【区间合并模板】
class Solution {public int[][] merge(int[][] intervals) {// 区间合并模板//1. 边界判断if (intervals.length == 0) return new int[0][];// 2. 按区间起始位置排序 (Lambda表达式)Arrays.sort(intervals, (a, b) -> a[0] - b[0]);LinkedList<int[]> res = new LinkedList<>();for (int[] interval : intervals) {// 3. 合并逻辑:比较最后一个区间的结束位置if (!res.isEmpty() && res.getLast()[1] >= interval[0]) {// 如果可以合并,那就更新y坐标的值(两者最大值) res.getLast()[1] = Math.max(res.getLast()[1], interval[1]);} else {// 如果不可以合并,那就是新区间,写入res.add(interval);}}// 4. 转换为数组返回return res.toArray(new int[res.size()][]);}
}
15. 轮转数组
求解思路: 辅助数组、翻转思想
【辅助数组、翻转】
class Solution {public void rotate(int[] nums, int k) {// 方法1:辅助数组// int[] res = solve1(nums,k);// 方法2:整体局部翻转int[] res = solve2(nums,k);for(int i=0;i<nums.length;i++) {nums[i] = res[i];} }// 翻转函数private void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start += 1;end -= 1;}}// 解法1public int[] solve1(int[] nums,int k) {int[] res = new int[nums.length];k = k % nums.length;// 遍历原数组for(int i=0;i<nums.length;i++) {int j = (i + k) % nums.length;res[j] = nums[i];}return res;}// 解法2public int[] solve2(int[] nums,int k) {k = k % nums.length;// 整体翻转reverse(nums,0,nums.length-1);// 两个局部分别翻转reverse(nums,0,k-1);reverse(nums,k,nums.length-1);return nums;}
}
16. 除自身以外的数组的乘积
**求解思路:**除自身之外的数组的乘积,可以分割为当前元素前缀乘 与 后缀乘的乘积。
为什么要提前计算这两个乘积呢,其实就是空间换时间的体现啦。
【前缀预处理思想法】
class Solution {public int[] productExceptSelf(int[] nums) {// 前缀乘、后缀乘int n = nums.length;int[] ln = new int[n];int[] rn = new int[n];ln[0] = 1;for(int i=1;i<n;i++) {ln[i] = nums[i-1] * ln[i-1];}rn[n-1] = 1;for(int i=n-2;i>=0;i--) {rn[i] = rn[i+1] * nums[i+1];}int[] res = new int[nums.length];for(int i=0;i<n;i++) {res[i] = ln[i] * rn[i];}return res;}
}
17. 今日总结
今天刷题量相比昨天少一些,主要是遇到太多特别难缠的题目了。今天最大的收获就是滑动窗口思想,滑动窗口主要解决动态连续区间内的最值、符合某种条件的组合值等问题。其他的还有像动态规划、前缀和思想、区间合并思想。
另外,今天在刷题的过程中还是遇到了很多问题,特别是对于一些陌生的数据结构例如Deque、LinkList,以及一些字符串的方法和处理手段。不断刷题,巩固起来!
相关文章:
LeetCodeHot100_0x02
LeetCodeHot100_0x02 11. 滑动窗口最大值(不熟) 求解思路: 暴力法的时间复杂度是O(NK),在K常数较大时复杂度就高了。所以我们要想办法将K优化掉,即本题的难点在于如何在O(1)的时间复杂度求出当前窗口中的最大值。这个…...
STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动
SPI总线驱动整体上与I2C总线驱动类型,差别主要在设备树和数据传输上,由于SPI是由4根线实现主从机的通信,在设备树上配置时需要对SPI进行设置。 原理图可知,数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…...
H7 based Phalanx G1 ETH Data Switch Hub UART Interface 介绍
外接接口配置 H7 based Phalanx G1 ETH Data Switch hub UART interface 1.对外接接口进行详细介绍 以下是针对 H7 based Phalanx G1 设备的外接接口配置的详细解析,重点说明其 ETH Data Switch Hub 和 UART Interface 的技术特性与应用场景: 一、核…...
Vue04
自定义指令 directives是Vue的一个配置项 这里写自定义指令 自定义指令被调用的时机 指令与元素成功绑定时 指令所在的模板被重新解析时 函数式 <span v-big"n"></span> directives:{ big(element,binding){ element.innerText bingin…...
OpenCV(9):视频处理
1 介绍 视频是由一系列连续的图像帧组成的,每一帧都是一幅静态图像。视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。 视频分析: 通过视频处理技术,可以分析视频中的运动、目标、事件等。…...
短剧源码部署搭建小程序搭建IAA+IAP混合解锁模式
在当今数字化内容消费迅速增长的时代,短剧作为一种新兴的内容形式,凭借其短小精悍、节奏紧凑的特点,迅速吸引了大量用户。作为一名软件体验测试人员,我有幸体验了一款集创新与实用为一体的短剧小程序。这款小程序不仅在前端用户体…...
基于 CFD 预测的机器学习第 2 部分:在 Benchmark 应用程序上使用 Stochos 预测流场
了解机器学习和 Stochos 如何彻底改变制造业的 CFD 预测。 挑战 预测复杂流体动力学场景中的流场一直是工程师和科学家面临的重大挑战。传统的计算流体动力学 (CFD) 方法需要大量的计算资源和时间,因此难以处理实时预测和大规模模拟。 此外…...
NLP的预处理数据
处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字,然后转换为张量,成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型,重要的是使用与之关联的…...
数据结构——单链表
前言 1. 什么是链表 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。与顺序表不同,链表的存储数据在内存是随机分布的。 2. 链表的分类 链表的种类多种多样,其中最常见的有八种…...
SurfaceFlinger代码笔记
drawLayers是做client合成,合成完以后的buffer会放在RenderSurface里 FrameBufferSurface里的buffer是通过setClientTarget给到HWC的(HWC应该给client合成的buffer留了一个slot) Output.cpp这个文件非常关键,代表着具体一个Display的操作 d…...
Linux-Ansible模块进阶
文章目录 Copy和FetchFile模块 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月22日18点49分 Copy和Fetch copy和fetch模块实践 copy模块需要注意的点:在收集日志之前…...
【机器学习】强化学习(2)——捋清深度强化学习的思路
在之前学习的过程中我了解到深度学习中很重要的一个概念是反向传播,最近看论文发现深度强化学习(DRL)有各种各样的方法,但是却很难区分他们的损失函数的计算以及反向传播的过程有何不同。在有监督的学习中,损失可以理解…...
touchgfx的工作机制
touchgfx的工作机制 一.MVP软件架构 MVP的全称为Model-View-Presenter Model: 就是数据部分,在整个touchgfx应用中,只有一个Model类实例对象,它为所有的Screen屏幕界面服务,可以理解成是一个全局变量区,同时它还负责和后端系统通信 View: 就是UI界面部分,对应于View类,在整…...
Fisher信息矩阵(Fisher Information Matrix, FIM)与自然梯度下降:机器学习中的优化利器
Fisher信息矩阵与自然梯度下降:机器学习中的优化利器 在机器学习尤其是深度学习中,优化模型参数是一个核心任务。我们通常依赖梯度下降(Gradient Descent)来调整参数,但普通的梯度下降有时会显得“笨拙”,…...
2025数学建模竞赛汇总,错过再等一年
01、2025第十届数维杯大学生数学建模挑战赛(小国赛) 竞赛介绍:数学建模行业内仅次于国赛和美赛的的第三赛事,被多所高校认定为国家级二类竞赛。赛题类型是国内唯一和高教社杯国赛题型风格完全一致的全国性数学建模竞赛࿰…...
设计模式教程:观察者模式(Observer Pattern)
一、模式概述 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系。一个对象(称为主题)状态发生变化时,所有依赖于它的对象(称为观察者)都会自动得到…...
代码随想录算法训练营第九天| 151.翻转字符串里的单词、右旋转字符串 、28. 实现 strStr()、459.重复的子字符串、字符串总结
151.翻转字符串里的单词 题目链接:151.翻转字符串里的单词 文档讲解:代码随想录翻转字符串里的单词 视频讲解:LeetCode:翻转字符串里的单词 状态:参考自己写出来的 思路: 反转:思路很清晰&#…...
bpmn.js + Node.js_构建高效的后端工作流处理系统
1. 引言 1.1 研究背景与意义 随着企业业务的复杂化,传统的流程管理工具已难以满足需求。BPMN(Business Process Model and Notation)作为一种标准化的流程建模语言,结合 bpmn.js 和 Node.js 可以实现高效的工作流管理系统,提升企业的运营效率。 1.3 BPMN 和 bpmn.js 简…...
DeepSeek系统架构的逐层分类拆解分析,从底层基础设施到用户端分发全链路
一、底层基础设施层 1. 硬件服务器集群 算力单元: GPU集群:基于NVIDIA H800/H100 GPU构建,单集群规模超10,000卡,采用NVLink全互联架构实现低延迟通信。国产化支持:适配海光DCU、寒武纪MLU等国产芯片,通过…...
嵌入式硬件基础知识
1.电阻(主要是贴片电阻) 01 基础课程-电阻 1.电阻封装 2.相关参数 1.功率额定值: 电阻能够长期承受的最大功率,功率过大可能导致电阻过热或损坏。封装尺寸越大,散热能力越强,功率额定值通常越高。 2.容差: 电阻…...
springboot+dubbo+zookeeper的注册服务和调用实践
目录 zookeeper为什么可作为注册中心zookeeper注册中心优缺点启动zookeeper编写springboot项目提供dubbo服务1. 服务接口2. Springboot引入dubbo实现服务接口2.1 工程目录和依赖2.2 启动程序和application.properties2.3 DubboService 实现服务接口2.4 测试api,用于…...
ARM Cortex-M处理器中的MSP和PSP
在ARM Cortex-M系列处理器中,MSP(主堆栈指针)和PSP(进程堆栈指针)是两种不同的堆栈指针,主要用于实现堆栈隔离和提升系统可靠性。以下是它们的核心区别和应用场景: 1. 基本定义 MSP(…...
计算机网络:应用层 —— 电子邮件
文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件(E-mail)是因特网上最早…...
Vue3 + Spring WebMVC 验证码案例中的跨域问题与解决方法
最近在基于vue3 SpringWebMVC前后端分离的开发环境中实现一个验证码的案例,在开发过程中遇到了一些复杂的跨域问题,现已解决,故将解决方法分享,希望能帮到有需要的人。 出现的问题: 对于验证码的实现,我选…...
【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Comfy UI 快捷键
Comfy UI 页面的快捷键操作(记录下,以防忘记): 捷径命令Ctrl Enter将当前图表排队等待生成Ctrl Shift Enter将当前图表排成第一个生成图表Ctrl Z/Ctrl Y撤消/重做Ctrl S保存工作流程Ctrl O加载工作流Ctrl A选择所有节点A…...
【C++】Arrays
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、一维数组的定义与初始化1.1、一维数组的定义1.2、一维数组的初始化 2、一维数组的使用3、一维数组与函数4、二维数组4.1、二维数组的定义4.2、二维数组的初始…...
EX_25/2/24
写一个三角形类,拥有私有成员 a,b,c 三条边 写好构造函数初始化 abc 以及 abc 的set get 接口 再写一个等腰三角形类,继承自三角形类 1:写好构造函数,初始化三条边 2:要求无论如何,等腰三角形类对象&#x…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
代码随想录D52-53 图论 Python
目录 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104. 建造最大岛屿 101. 孤岛的总面积 要点: 整体来说是一个图着色的问题。 这道题目的思路符合直觉,但代码实现会和直觉有差别。如果仅使用visit记录不使用着色,会遇到非常多的…...
机器学习(部分算法、模型)
一、KNN 算法 原理 K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别; 如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别 比如: 有10000个样…...
axios几种请求类型的格式
Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…...
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)
SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密) 前言 在SpringBoot的项目开发中,大多数情况下 yml 配置文件中存储的密码均以明文形式展示,这种方式显然存在较大的安全隐患。一旦有开发人员离职&…...
【C语言】指针笔试题
前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…...
力扣 下一个排列
交换位置,双指针,排序。 题目 下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列&…...
Three.js 快速入门教程【八】常见材质类型
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
python~http的请求参数中携带map
背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...
爬虫第九篇-结束爬虫循环
最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…...
考研/保研复试英语问答题库(华工建院)
华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…...
《Effective Objective-C》阅读笔记(中)
目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...
前端如何解决跨域
解决前端跨域问题有多种方法 JSONP:利用 <script> 标签的跨域能力,通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求,安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…...
【HDLbits--Comb组合逻辑】
HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中,组合逻辑(Combinational Logic)是指输出仅依赖于当前输入的逻辑电路,没有记忆功能(即没有状态存储)。组合逻辑的特点是: 无时钟信号…...
如何在 Linux 上安装和配置 Zsh
文章目录 如何在 Linux 上安装和配置 Zsh1. 安装 Zsh1.1 在 Ubuntu/Debian 上安装1.2 在 CentOS/RHEL/Fedora 上安装1.3 在 Arch Linux 上安装1.4 验证 Zsh 安装 2. 设置 Zsh 为默认 Shell2.1 验证默认 shell 3. 配置 Zsh3.1 使用 Oh My Zsh3.1.1 安装 Oh My Zsh3.1.2 启用插件…...
Chromedriver与Chrome版本映射表
Chromedriver与Chrome版本映射表如下: Chrome 71-73版本对应Chromedriver 2.46Chrome 70-72版本对应Chromedriver 2.45Chrome 69-71版本对应Chromedriver 2.44Chrome 68-70版本对应Chromedriver 2.43Chrome 67-69版本对应Chromedriver 2.42…...
HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒
一、引言 在 HarmonyOS 那丰富多彩的系统界面中,从简洁直观的应用图标,到交互流畅的操作菜单,再到生动形象的图文展示,每一处细节都经过精心雕琢,为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…...
06C语言——指针
一、指针入门 (1)、准备知识 0、图解: 1、内存地址 字节:字节是内存的容量单位,英文称为 byte,一个字节有8位,即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址:系统为了便于区分每一个字节而对…...
Ubuntu DeepSeek磁盘空间不够解决办法
标签: Ubuntu; DeepSeek磁盘空间不够解决办法;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题:Ubuntu 22, DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统,台式…...
东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急
《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...
Qt layout
文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结:示例代码说明:结论: Qt layout 在 Qt 中,当调用 widget->setLayout(layout) 时,layout 的父对象会被自动设置为该 widget…...
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程…...