238.除了自身以外的乘积
238.出了自身以外数组的乘积给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
思路
前缀和
后缀和
123456789101112131415161718192021222324252627282930313233package com.wereash.scut_hot100.dp;import java.util.Scanner;/** * @Author: WereAsh * @Date:2026-02-18 23:19 **/public class Solution238 { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); String[] str=scanne ...
Transformer
Transformer编码器每个Encoder Layer的主要任务都是对其输入序列进行上下文建模,使每个位置的表示能够融入整个序列的全局信息
两个子层:
自注意力子层(Self-Attention):用于捕捉序列中各位置之间的依赖关系
前馈神经网络子层(Feed-Forward):用于对每个位置的表示进行线性变换,从而提升模型的表达能力
自注意力子层计算过程:
生成Query、Key、Value向量
计算位置之间的相关性
计算注意力权重:使用softmax函数进行归一化
加权汇总生成输出
多头注意力机制自注意力机制通过QKV向量计算每个位置与其他位置之间的依赖关系,使模型能够有效捕获序列中的全局信息
为理解显示语言中的句子,模型需要同时识别并建模多种层次和类型的依赖关系。但这些信息很难通过单一视角或一套注意力机制完整捕获
多头注意力机制(Multi-Head Attention),就是通过多组独立的QKV投影,让不同注意力头分别专注于不同的语义关系,最后将各头的输出拼接融合。
原始论文中为8头
前馈神经层对每个位置的表示进行逐位置、非线性的特征变换,进一步提升模型的对复杂语义 ...
LoRA
LoRA思路:与其每次复制整个模型,不如只调整一小部分参数,把成本降下来
亮点:
参数少:它只微调原始参数的1%甚至更少
速度快:训练和部署都比全参数微调省时省力
模块化:训练好的LoRA“插件”可以随时加载或卸载,不影响原始模型,特别适合多任务场景
原理奇异值分解SVD可以把任意矩阵分解成三个矩阵的乘积。
r是矩阵的秩,决定了分解后保留的信息量。如果只保留最大的奇异值,就可以用更少的参数近似w
矩阵信息量主要集中在奇异值较大的方向中
矩阵本身非常大,但信息集中在少数几个方向的矩阵,称为低秩矩阵,任何一个低秩矩阵都可以通过奇异值分解,去降低他的参数两
研究发现,通过微调后的权重变化ΔW的奇异值分解,大部分信息集中在少数几个奇异值上。比如,LoRA论文在GPT-3上测试时,ΔW的前10-20个奇异值就占据了90%以上的信息
微调是为了强化模型某个特定领域的能力,不要对所有方向的参数进行调整。
如何更新参数W’=W+ΔW=W+A·B
其中:
W’是调整后的有效权重,用去前向传播
W是预训练模型的原始矩阵,形状为(d,k)
ΔW是LoRA引入的调整量(增量),也是形 ...
230.二叉搜索树中第k小的元素
230.二叉搜索树中第k小的元素给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(k 从 1 开始计数)。
思路
k--应该在访问该节点之前,否则,在递归结束之后可能k==1的情况可能再次出现
java对于普通变量是传递形参
解决变量值传递的问题,可以用全局变量或者数组
方法1:
12345678910111213141516171819class Solution { int ans=0; int count=0; public int kthSmallest(TreeNode root, int k) { count=k; midSearch(root); return ans; } private void midSearch(TreeNode root){ if(root==null) return; midSearch(root.left); count--; ...
104.二叉树的最大深度
104.二叉树的最大深度给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
123456789public class Solution{ public int maxDepth(TreeNode root){ return dfs(root,0); } private int dfs(TreeNode root,int depth){ if(root==null) return depth; return Math.max(dfs(root.left),dfs(root.right))+1; }}
105.相同的树给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
123456789101112public class Solution{ public boolean isSameTre ...
198.打家劫舍
198.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
思路
本质上就是加不加上当前值的问题
只不过初始值dp[0],dp[1]需要分析
dp[1]表示对第二间房子偷不偷,那么就是要么偷第一间,要么偷第二间
123456789101112131415161718192021222324252627282930313233package com.wereash.scut_hot100.dp;import java.util.Scanner;/** * @Author: WereAsh * @Date:2026-02-09 21:19 **/public class Solution198 { public static void main(String[] args){ Scanner scan ...
200.岛屿数量
200.岛屿数量给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
思路
由于四条边都被水包围,只要有陆地存在,肯定存在一个岛屿
同处于一个岛屿的陆地,那么陆地A必然与陆地B的上下左右一个方向相连接
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package com.wereash.scut_hot100.digui;import java.util.Scanner;/** * @Author: WereAsh * @Date:2026-02-08 19:28 **/public class Solution200 { public static void main(String[] args){ Scann ...
1796.字符串中第二大的数字
1796.字符串中第二大的数字给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。
混合字符串 由小写英文字母和数字组成。
1234567891011121314151617181920class Solution { public int secondHighest(String s) { char[] str=s.toCharArray(); int maxMax=-1; int minMax=-1; for(int i=0;i<str.length;i++){ if(!Character.isDigit(str[i])){ continue; } int temp=str[i]-'0'; if(temp>maxMax){ minMax ...
674.最长连续递增子序列
674.最长连续递增子序列给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
123456789101112131415class Solution { public int findLengthOfLCIS(int[] nums) { int max=1; int cur=max; for(int i=1;i<nums.length;i++){ if(nums[i]>nums[i-1]){ cur++; }else{ cur=1; ...
345.反转字符串中的元音字母
345.反转字符串中的元音字母给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次。
思路思路一
map
用index记录是当前出现的第几个元音字母
倒序index–,代替元音字母
1234567891011121314151617181920212223242526272829303132333435363738394041package com.wereash.scut_hot100.stack;import java.util.Deque;import java.util.HashMap;import java.util.LinkedList;import java.util.Map;/** * @Author: WereAsh * @Date:2026-02-05 14:45 **/public class Solution345 { public static void m ...








