尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java数组算法刷题:从边界条件到双指针前缀和二分
1. 为什么数组值得单独刷一整轮我带过几个刚学完 Java 语法的同学做算法题发现一个很一致的现象链表、二叉树、动态规划这些词听着唬人真正卡住他们的往往是最朴素的数组题。一道移除元素能写出三个越界异常一道两数之和能把有序条件看漏。所以我一直建议Java 基础编程 500 题里数组这一块不要当成入门热身草草跳过它更像是整本题库的地基地基歪了后面所有序列类题目的手感都是歪的。先把概念说清楚。Java 数组是一块定长、连续、引用类型的内存区域它在堆上分配变量里存的是地址长度由length这个字段给出——注意是字段不是length()方法这一点和String正好相反多少人第一次写就栽在这里。数组题指的也不只是定义一个数组然后遍历它覆盖的是所有以下标为索引去访问、修改、统计、重排连续数据的题目求和求最值、去重、区间统计、滑动窗口、前缀和、二分查找、二维矩阵模拟全都算。那500 题这个量级意味着什么它不是让你无脑刷完 500 道而是这个体量足够把一个知识点拆成足够多的变体让题型—模板—边界这三件事在你脑子里形成条件反射。我自己整理的数组模块大概分成语法夯实、模拟统计、双指针、前缀和差分、二分排序、二维矩阵六个方向加起来三百多道加上变体和改题练习凑到五百题量。这套东西适合三类人刚学完语法想找手感的新手、准备笔试面试需要快速恢复状态的开发者、以及写业务代码多年但基础已经生锈、想重新捋一遍的老手。下面我把这套题库的组织逻辑、核心模板、Java 特有的坑以及我踩过的那些血泪经验完整拆一遍。你可以直接照着刷也可以只挑自己薄弱的那一块。2. 题库怎么切分从语法题到算法题的四个台阶2.1 四个台阶的划分依据很多人刷数组题的顺序是乱的今天做一道求和明天做一道螺旋矩阵做完感觉啥都会一上机啥都写不出。问题出在没有台阶感。我给数组模块设计的顺序是按认知负荷递增的一共四个台阶每个台阶解决一类问题前一个台阶没过关不要跳到下一个。第一个台阶是语法与遍历大约 120 题。这一层不涉及任何算法思想纯粹是把怎么正确地把数组从头走到尾这件事练成肌肉记忆正序、逆序、步长为 2、嵌套遍历、边遍历边更新最值、求和求平均、统计满足条件的个数、找出第一个/最后一个满足条件的位置。听起来很简单但这一层真正要练的是边界条件——空数组怎么办单元素怎么办全部元素相同时怎么办目标值在第一个位置和在最后一个位置分别是什么结果。这些题的正确答案往往只有一行代码但你能不能一次写对决定了后面所有题的下限。第二个台阶是模拟与统计大约 150 题。开始有一点想法了计数排序的思想用值当下标的桶、频率统计、去重、找重复、找缺失、数组旋转、区间合并、简单排序的实现。这一层的核心训练点是用数组本身当数据结构也就是常说的空间换时间以及理解下标和值之间可以建立映射关系。这一步过了你再看哈希表就不会觉得它是凭空冒出来的东西。第三个台阶是双指针与原地修改大约 100 题。这是数组题真正的分水岭。原地删除、原地去重、有序数组两数之和、反转、回文判断、合并两个有序数组、颜色分类这类题考的都是用两个下标协同工作不使用额外空间。能不能理解写指针永远不会超过读指针这个不变量是这一层的关键。第四个台阶是前缀和、差分、滑动窗口、二分大约 130 题。到这一层才开始有一点算法的味道但本质上还是在做下标运算只是加了一层预处理或者一层收缩逻辑。我个人的经验是前缀和和滑动窗口一定要在这一层一起学因为它们解决的是同一类问题的两种视角一个是提前算好区间和一个是边走边维护区间。2.2 刷题节奏与验收标准光有分类还不够还得有节奏。我用的是三遍法每一遍的目标完全不同不能混着来。遍数目标做法单题耗时验收标准第一遍建立题感独立写卡住 20 分钟就看题解看完合上自己重写一遍25-40 分钟能讲清楚每一步为什么这么写第二遍固化模板隔 3 到 7 天不看任何资料白板默写10-15 分钟一次编译通过边界用例全过第三遍抗变形自己改条件加重复元素、改成环形、改成有序、改成有负数15-20 分钟能说出原模板哪一行需要改、为什么第一遍最容易犯的错是看懂了就等于会了。看懂题解和自己写出代码之间隔着一条河河的名字叫下标。我强烈建议第一遍就用手写或者纯文本写不要依赖 IDE 的自动补全因为补全会掩盖你对变量名和边界的记忆模糊。第二遍是真正拉开差距的地方。我见过太多人第一遍刷得飞快一周后同一道题连用什么思路都想不起来。白板默写是唯一能暴露假会的方法。默写时不要允许自己大概这样i n还是i n必须明确写出来。第三遍则是从会做题到会解题的关键。原题的条件是出题人给的改题的条件是你自己造的。比如删除有序数组中的重复项你写完了那就试着改成最多保留两个重复两数之和有序写完了改成三数之和最大子数组和写完了改成返回起止下标。能改得动说明你抓的是思路而不是代码形状。提示第三遍改题不需要真的提交到判题系统能在纸上写出正确代码、心里跑通三个用例就足够了。改题的价值在于逼你想清楚每个变量的语义。3. 核心模板逐个拆从遍历到二分3.1 单层遍历先把边界摸清楚数组题里最高频的结构就是单层for循环加几个状态变量。看起来平平无奇但它承载了绝大多数统计型题目。写这类代码我固定按四步走先定初始值再定循环范围再定更新逻辑最后定返回什么。初始值的坑最深。求最大值时把max初始化成0遇到全是负数的数组就直接错求最小值时初始化成0遇到全是正数的数组也错。正确做法是初始化成数组第一个元素或者用Integer.MIN_VALUE/Integer.MAX_VALUE并把空数组单独判断。我自己习惯前者因为它天然处理了数组里一定有元素这个前提而且不需要额外记忆极值常量。public static int maxOf(int[] a) { if (a null || a.length 0) { throw new IllegalArgumentException(数组不能为空); } int max a[0]; for (int i 1; i a.length; i) { if (a[i] max) { max a[i]; } } return max; }注意循环从i 1开始因为a[0]已经被用作初始值了。这个细节很多人写反从 0 开始也没错但会多一次无意义的比较。更重要的是从 1 开始能在你脑子里强化第一个元素已经处理过这个认知后面写复杂题时不容易漏。增强 for 循环是另一处高频陷阱。for (int x : a)拿到的是元素的副本改x不会改数组。要修改数组元素必须用带下标的普通 for 循环。// 错误数组不会有任何变化 for (int x : arr) { x x * 2; } // 正确 for (int i 0; i arr.length; i) { arr[i] arr[i] * 2; }还有一个容易被忽略的点遍历方向。有些题必须逆序比如从后往前覆盖写、计算每个元素右侧的最大值。逆序写法的循环条件是i 0漏掉等号就会漏掉下标 0 的元素而 0 号元素往往是答案。我自己的检查方法是写完循环后嘴里念一遍最后一个下标是多少循环跑到那里停不停。3.2 双指针与原地修改理解那个不变量原地修改类题目是数组模块里最值得反复咀嚼的一类。它的核心不是技巧而是一个可以证明的不变量写指针w永远小于等于读指针r。因为w只在写入成功时前进而r每轮都前进所以写入位置永远在读取位置的左边或同一位置不会覆盖掉还没读的数据。以移除元素为例把不等于目标值的元素往前挪public static int removeElement(int[] nums, int val) { int w 0; for (int r 0; r nums.length; r) { if (nums[r] ! val) { nums[w] nums[r]; w; } } return w; }返回的w恰好是新数组的长度因为写入是从 0 开始连续进行的前w个位置就是有效数据。这也是为什么这类题的返回值是新长度而不是一个新数组——原地修改的约定就是把有效结果压缩到数组前段后面是什么不用管。删除有序数组中的重复项是同一套骨架只是判断条件从不等于 val变成不等于上一个写入的值public static int removeDuplicates(int[] nums) { if (nums.length 0) return 0; int w 1; for (int r 1; r nums.length; r) { if (nums[r] ! nums[w - 1]) { nums[w] nums[r]; w; } } return w; }这里w从 1 开始因为第一个元素一定保留。判断用的是nums[w - 1]已经写入的最后一个有效值而不是nums[r - 1]这个区别在最多保留两个重复的变体里会变得非常关键——那时候你得比较nums[w - 2]。左右指针是另一种形态典型场景是有序数组。两数之和、反转数组、判断回文都是l从左边走、r从右边走根据条件决定移动哪一边。public static int[] twoSumSorted(int[] nums, int target) { int l 0, r nums.length - 1; while (l r) { int sum nums[l] nums[r]; if (sum target) return new int[]{l, r}; if (sum target) l; else r--; } return new int[]{-1, -1}; }为什么有序就能这么干因为当nums[l] nums[r] target时nums[l]和任何比nums[r]小的数相加都更小所以l这一位可以安全淘汰反之r可以淘汰。这个淘汰的论证必须能自己说出来不然换个场景你就不知道能不能用了。注意左右指针只对有序数组成立。题目给的数组无序时要么先排序会丢失原始下标需要额外记录要么换哈希表。这是我见过最多的误用。3.3 前缀和与差分把区间查询变成两次减法前缀和是我认为数组模块里性价比最高的一个技巧。它把任意区间求和从 O(n) 降到 O(1)代价是一次 O(n) 的预处理和一份额外空间。原理非常朴素如果pre[i]表示前i个元素的和那么区间[l, r]的和就是pre[r1] - pre[l]。int n a.length; long[] pre new long[n 1]; for (int i 0; i n; i) { pre[i 1] pre[i] a[i]; } // 区间 [l, r] 的和 long sum pre[r 1] - pre[l];为什么数组开n 1而不是n因为这样pre[0] 0天然表示空前缀区间从左端 0 开始时不用特判公式统一。这就是所谓多开一位省十个 if的经典案例。我第一次写前缀和时用的是长度n的数组结果每次l 0都要单独判断代码丑且容易错。为什么用long而不是int这是实打实的血泪。数组元素如果是int范围内的值几百万元素累加很容易越过int上限溢出后结果变成负数你还以为是逻辑错了。凡是求和、求积、求累加的题我现在的默认动作就是开long除非题目明确保证范围很小。差分是前缀和的逆运算用来解决多次区间加同一个值的问题。做法是只在区间起点加、终点后一位减最后做一次前缀和还原int[] diff new int[n 1]; // 对区间 [l, r] 每个元素加 v diff[l] v; diff[r 1] - v; // 还原 int cur 0; for (int i 0; i n; i) { cur diff[i]; a[i] cur; }这个技巧在会议室预订、区间覆盖计数、批量改价这类场景里非常好用。判断该用前缀和还是差分看你操作的方向查询多、修改少用前缀和修改多、查询少用差分。3.4 滑动窗口把连续子数组问题收进一个框滑动窗口处理的是一类固定句式在数组里找一个连续子数组满足某种条件求最长/最短/个数。它和前缀和是亲戚但思路反过来——前缀和是预处理全部区间滑窗是边走边收缩。定长窗口最直接比如求长度为 k 的子数组的最大平均值先把前 k 个加起来然后每次加右边一个、减左边一个。double maxAvg(int[] a, int k) { long sum 0; for (int i 0; i k; i) sum a[i]; long best sum; for (int i k; i a.length; i) { sum a[i] - a[i - k]; best Math.max(best, sum); } return best * 1.0 / k; }变长窗口稍微绕一点通常是右指针扩张、左指针收缩收缩的条件由题目给出。写这类代码的关键是明确窗口内维护的是什么量——是和、是不同元素个数、还是最大值。这个量必须能在加入和移除元素时 O(1) 更新否则滑窗就没意义了。int minLenWithSumAtLeast(int[] a, int target) { int l 0, sum 0, best Integer.MAX_VALUE; for (int r 0; r a.length; r) { sum a[r]; while (sum target) { best Math.min(best, r - l 1); sum - a[l]; l; } } return best Integer.MAX_VALUE ? 0 : best; }这里有个前提数组元素必须非负。因为只有非负移除左边元素才会让和变小while循环才收敛。如果数组有负数这个模板直接失效得换前缀和加哈希表的思路。很多人刷题时不看数据范围照着模板抄遇到负数就死循环还找不到原因。3.5 二分的两种写法选一种然后背下来二分查找的边界问题是老生常谈但我要说的不是要注意边界而是只学一种写法把另一种彻底忘掉。混着用是出错的最大来源。我固定用左闭右闭的写法l 0, r n - 1循环条件l r收缩时l mid 1或r mid - 1。这套写法里l和r始终是当前搜索区间的闭区间端点区间为空的条件是l r逻辑自洽不需要额外记忆。// 找目标值找不到返回 -1 public static int binarySearch(int[] a, int target) { int l 0, r a.length - 1; while (l r) { int mid l (r - l) / 2; if (a[mid] target) return mid; if (a[mid] target) l mid 1; else r mid - 1; } return -1; }mid写成l (r - l) / 2而不是(l r) / 2是为了避免两个大数相加溢出。虽然 Java 的int能扛到 21 亿实际题目里很少越界但这个习惯值得养成因为面试官看到会认为你真的想过这件事。找边界第一个大于等于目标的位置时模板稍微改一下关键区别是命中时不要立刻返回而是继续往左收缩// 返回第一个 target 的下标不存在返回 a.length public static int lowerBound(int[] a, int target) { int l 0, r a.length - 1, ans a.length; while (l r) { int mid l (r - l) / 2; if (a[mid] target) { ans mid; r mid - 1; } else { l mid 1; } } return ans; }这套模板能解决第一个位置最后一个位置插入位置统计小于某值的个数一整族问题只要你会把换成、把换成。我的建议是把它当成一个可配置的机器变量只有两个比较符和收缩方向。提示Arrays.binarySearch也能用但它返回的是如果找到就返回下标找不到就返回-(插入点) - 1这个负数约定很多人记不住。刷题时我建议手写二分业务代码里再考虑用现成方法。3.6 二维数组行数列数别搞混二维数组的题九成的错误出在length上。数组名.length给的是行数a[0].length才是列数。Java 的二维数组本质是数组的数组每一行是独立对象所以允许锯齿形每行长度不同。这意味着你不能想当然地认为所有行的列数一样写a[0].length之前要确认第一行存在。int rows a.length; int cols rows 0 ? 0 : a[0].length;遍历二维数组时我习惯外层用i走行、内层用j走列并且内层条件写j a[i].length而不是j cols。前者对锯齿数组天然安全后者在行列不齐时会越界。虽然大多数题目给的是规则矩阵但这个写法不需要额外成本属于免费的保险。顺时针打印、转置、旋转 90 度这类模拟题诀窍是先把下标映射画在纸上别想着临场推。比如转置的映射是b[j][i] a[i][j]顺时针旋转 90 度是b[j][n-1-i] a[i][j]。我自己的做法是拿一个 3×3 的方格把每个位置的原坐标和目标坐标都写出来找到规律后再写代码。纸上花三分钟代码少调半小时。原地旋转 90 度还有个经典套路先沿主对角线转置再左右翻转每一行。这个方法不用额外空间但顺序不能反——先左右翻转再转置得到的是逆时针。4. Java 数组那些特有的坑4.1 语法层的六个高频陷阱第一默认值。new int[5]里全是 0new boolean[5]里全是falsenew String[5]里全是null。这个默认值行为只对数组和成员变量成立局部变量不初始化直接用会编译报错。所以为什么我的计数数组没问题和为什么我的局部变量报错这两个现象可以同时存在别混为一谈。第二数组是对象赋值是引用共享。int[] a {1, 2, 3}; int[] b a; // b 和 a 指向同一块内存 b[0] 99; // a[0] 也变成 99 了要真正复制一份一维数组可以用a.clone()、Arrays.copyOf(a, a.length)或System.arraycopy。二维数组不能只用Arrays.copyOf因为它复制的是外层引用内层还是共享的必须逐行cloneint[][] copy new int[a.length][]; for (int i 0; i a.length; i) { copy[i] a[i].clone(); }这个坑我在刷生命游戏这类需要保留原状态的题时踩过改了半天以为是逻辑错了其实是副本把原数组改了。第三比较内容不能用。比的是引用地址。判断两个数组内容是否相同要用Arrays.equals(a, b)二维用Arrays.deepEquals。第四数组不能直接当HashMap的键。因为hashCode是基于引用计算的两个内容相同的数组会被当成不同的键。需要的话得转成List或者自己包一层。第五Arrays.asList的返回值坑。Arrays.asList(1, 2, 3)返回的是固定长度的列表add和remove会抛异常。而且传int[]进去时它会把整个数组当成一个元素得到的是Listint[]长度 1。这个坑极其隐蔽。第六char[]和String的互转。new String(charArray)和str.toCharArray()是标准写法但charArray.toString()返回的是类似[C1b6d3586这样的东西不是你以为的字符串。调试时想看字符数组内容用Arrays.toString或者直接new String(arr)。4.2 Arrays 工具类的高频方法java.util.Arrays是刷数组题离不开的工具箱我把常用的几个整理成表重点是那些容易记错参数的。方法作用容易记错的点Arrays.sort(a)升序排序对int[]是双轴快排对Integer[]是归并Arrays.sort(a, from, to)排序区间左闭右开to不包含Arrays.fill(a, v)填充只能填同一个值不能填递增序列Arrays.copyOf(a, n)复制n大于原长会补默认值Arrays.copyOfRange(a, from, to)复制区间同样是左闭右开Arrays.equals(a, b)内容比较一维够用二维要deepEqualsArrays.toString(a)转字符串二维要用deepToStringArrays.binarySearch(a, key)二分查找必须先排序找不到返回负数Arrays.stream(a).sum()求和返回long元素多时有优势排序这块有个重点Arrays.sort(int[], from, to)的区间是左闭右开和字符串的substring一致但和二分查找的闭区间习惯不一致。我自己的做法是只要用到带区间的 API就在代码旁边写一行注释标明区间类型避免自己骗自己。还有一个性能上的常识Arrays.sort对基本类型用的是双轴快排最坏情况 O(n²)但实际数据很难触发对引用类型用的是归并排序稳定但需要额外空间。刷题时基本不用管但如果题目明确卡时间用基本类型数组会比Integer[]快不少——装箱拆箱的开销在百万级数据上很可观。4.3 调试手法让错误自己现形数组题的 bug 有个特点代码不报错结果就是不对。这时候靠肉眼盯代码效率极低得让程序自己说话。我的第一招是统一打印格式。在关键位置插入一行打印把当前下标、关键变量、数组状态一起输出比零散地System.out.println(x)有效得多。System.out.printf(i%d, w%d, arr%s%n, i, w, Arrays.toString(arr));第二招是小数据暴力对拍。写一个 O(n²) 甚至 O(n³) 的朴素解法用随机生成的小数组跑几百组比较两个解法的输出。这个方法看起来笨但它是发现边界错误最快的方式。我刷最大子数组和时自己的 O(n) 解法和暴力解法在全是负数的用例上不一致一眼就定位到初始值设成了 0。第三招是准备一份固定用例清单每次写完题都跑一遍。我的清单是这样的空数组、单元素、两元素、全相同、全递增、全递减、全负数、含 0、含重复、目标值在首尾、目标值不存在。这份清单不長但覆盖了 90% 的边界问题。第四招如果题目允许用assert或者手写检查函数验证不变量。比如原地修改类题目可以在返回前检查前w个元素里没有目标值这一条断言能抓住绝大多数写入逻辑的错误。注意线上环境和部分判题系统默认关闭断言assert只适合本地自测。别把业务逻辑写进assert里否则关掉断言后逻辑就消失了。5. 高频报错速查与避坑经验5.1 报错信息对照表下面这张表是我这些年被问得最多的几类问题按现象—原因—改法整理遇到问题可以先对号入座。现象常见原因改法ArrayIndexOutOfBoundsException循环条件写成mid 1越界访问a[n]检查上下界闭区间配开区间配NullPointerException数组未初始化a[i]本身是null用前判空二维数组先判行再判列结果总是少 1 或多 1把长度和最大下标混用左闭右开记错记住长度 最大下标 1修改了原数组导致后续判断出错引用共享原地修改没备份需要保留原状态时先深拷贝求和结果是负数int溢出累加用long二分死循环l mid配l rmid没推进收缩必须是mid ± 1IllegalArgumentExceptionArrays.asList后调用add包一层new ArrayList(...)滑窗结果不对数组含负数换前缀和 哈希表5.2 三条不写在题解里的经验第一条先写注释再写代码。我在每道题开头写三行输入是什么、要返回什么、边界情况有哪些。这三行看起来浪费时间实际能省掉大量返工。尤其是要返回什么这一行——是返回新长度还是新数组是返回下标还是返回值是返回第一个还是最后一个题目描述经常藏着一层写下来就骗不了自己。第二条变量名带语义。i、j、k只在最简单的单层循环里用一旦出现双指针、滑窗、二分我立刻换成left、right、write、read、slow、fast。名字本身就是文档写错的时候视觉上会别扭这个别扭感能救你。第三条别在复杂度上撒谎。有些题看着是 O(n)实际因为在内层调用了Arrays.sort或者String拼接复杂度早就上去了。写完自己数一遍每层循环各跑多少次循环里有没有隐藏的 O(n) 操作。这一步在面试里尤其重要说不清楚复杂度代码写得再对也会被打折扣。还有一条关于刷题量的体会。500 题听起来很多但如果按我上面说的四个台阶分每个台阶一百多道一天 3 到 5 道一个多月就能过一遍。真正的瓶颈不在数量在于每道题有没有把边界想全、把不变量说清、把变体改过。我见过刷了两百道还在原地打转的也见过刷了八十道就能举一反三的差别就在这里。6. 从刷题到实际写代码数组思维的迁移6.1 业务代码里的数组套路很多人觉得刷题和干活是两回事我的观察恰恰相反。数组题训练的那套东西——边界意识、不变量、复杂度估算、原地修改——在实际写业务代码时天天用得上。举几个我实际遇到过的场景。批量处理一批记录时需要去掉某些满足条件的记录并保持顺序这就是原地删除只是从int[]换成了List。做数据统计时需要按某个区间分组求和这就是前缀和只是数据源从数组换成了数据库查出来的列表。做批量更新时给某个区间内的所有价格加上一个调整值这就是差分。写分页查询时找到第一个大于等于目标值的位置这就是lowerBound。区别在于业务代码里更强调可读性和可维护性而不是极致的空间优化。刷题时你追求 O(1) 额外空间业务里多用一个ArrayList完全没问题。但这不代表刷题没用——知道有更优解才有资格选择不优化。你在写业务代码时能一眼看出这里每次都重新求和数据量大了会慢这个判断力就是刷题给的。6.2 什么时候该用数组什么时候不该数组的优势是内存连续、访问快、开销小劣势是定长、插入删除要搬数据。所以判断标准很直接数据量确定、以随机访问为主、几乎不增删元素用数组数据量变化频繁、以增删为主用集合类。刷题时因为数据量给定几乎总是用数组实际项目里如果一开始就用int[]存不确定数量的数据后期扩容会很别扭。还有一个实际经验基本类型数组优先于包装类型数组。int[]比Integer[]省内存、快得多代价是不能存null、不能直接丢进需要Object的 API。如果确实需要和集合互转Arrays.stream(a).boxed()和list.stream().mapToInt(Integer::intValue).toArray()是标准路径但要注意流操作本身有开销别在热点循环里频繁转。最后分享一个我自己的习惯。每次刷完一组数组题我会在笔记里留一行这组题教会我的一个不变量。比如双指针那组留下的是写指针不会超过读指针二分那组留下的是区间为空等价于左端点越过右端点滑窗那组留下的是窗口内维护的量必须能 O(1) 更新。这些不变量比代码本身更值钱因为代码会忘判断力不会。等到某天在业务代码里看到一段循环脑子里能自动冒出这里的不变量是什么、边界在哪那这 500 题才算真正刷进了手里。
RELATED

相关推荐

语音翻译模型需要自己设计吗?Model Zoo选型与改造指南

语音翻译模型需要自己设计吗?Model Zoo选型与改造指南

好问题。最近总有人问我:ST 不是已经有 Model Zoo 了吗,啥模型都有,我们还要自己设计模型干嘛?说这话的人,多半是被 Hugging Face 上动辄几百页的模型列表搞得有点焦虑。这里的 ST 我指的是语音翻译(Speech…

📅 2026/11/2 8:03:16
MiMo V2.6后训练recipe解读:SFT、DPO与工程细节全拆解

MiMo V2.6后训练recipe解读:SFT、DPO与工程细节全拆解

一说到开源大模型,大家首先想到的往往是“权重能下了,赶紧加载跑个demo”。但真正做过训练的人心里都清楚,权重只是结果,决定一个模型能不能从“会续写文本”变成“会干活”,靠的是后面那套看不见的后训练玩法。最近我…

📅 2026/11/2 8:03:16
Java数组刷题指南:边界、双指针、二分与原地修改

Java数组刷题指南:边界、双指针、二分与原地修改

数组这个章节,在Java基础编程500题的整个体系里,是我花时间最多、也最建议新手反复啃的一块。原因很直接:你后面写业务代码、看框架源码、刷算法题,绕不开数组。而Java基础编程500题里数组相关的题量之所以能堆到五百道量级&#…

📅 2026/11/2 8:03:16
MORE NEWS

更多资讯

📰

Kornia 精度修复:`ConvQuadInterp3d` / `conv_quad_interp3d` 的 float16 梯度溢出(NaN)问题与 float32 提升方案

Kornia 精度修复:ConvQuadInterp3d / conv_quad_interp3d 的 float16 梯度溢出(NaN)问题与 float32 提升方案 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/Git…

📰

Kornia 增强 API 文档修正与 ColorJitter 固定 `order`:打造 torch.compile fullgraph 安全的确定性颜色增强

计算机视觉深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/GitHub_Trending/ko/kornia 点击查看 免费下载 导读 本文围绕 Kornia 迁移变更记录 changelog.d/migration-…

📰

Kornia normalize_quaternion float16 数值修复解析:eps 下限与除法保护机制的实现原理

计算机视觉深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/GitHub_Trending/ko/kornia 点击查看 免费下载 本篇文章深入剖析 Kornia 变更记录 changelog.d/migration-09…

📰

Kornia nms2d 支持非方形 kernel_size:一次 NMS 邻域核构造修复的源码级解析

计算机视觉深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/GitHub_Trending/ko/kornia 点击查看 免费下载 本篇技术指南围绕 Kornia 中 nms2d(2D 非极大值抑…

📰

Kornia 颜色空间转换的 TorchScript 兼容性修复:从 PEP 604 联合类型到 `Optional[torch.Tensor]`

计算机视觉深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/GitHub_Trending/ko/kornia 点击查看 免费下载 本文基于 changelog.d/migration-122.fixed.md 记录的迁移修复…

📰

PaperOrchestra Outline Agent工作原理:1次LLM调用如何生成驱动全局的outline.json

【免费下载链接】PaperOrchestra An automated AI research-paper writer based off Googles PaperOrchestra papers implementation through a skills - benchmark autoraters using any coding agent (Claude Code, Cursor, Antigravity, Cline, Aider). No API keys, no LL…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬