十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

千问 LeetCode 3911. 移除子数组元素后第 K 小偶数 TypeScript实现

千问    LeetCode 3911. 移除子数组元素后第 K 小偶数 TypeScript实现 这道题是 LeetCode 3911「移除子数组元素后第 K 小偶数」核心思路是二分答案 前缀和计数对每个查询在值域上二分第 k 个剩余偶数用前缀和快速统计子数组中被移除的偶数个数。题目理解给定严格递增数组 nums 和查询 [l, r, k]从全局正偶数序列 (2, 4, 6, 8, ...) 中移除 nums[l..r] 子数组里出现的所有偶数返回剩下的第 k 个偶数。核心思路1. 前缀和预处理遍历 nums用前缀和数组 cnt 记录前 i 个元素中有多少个偶数这样任意子数组 [l, r] 内的偶数个数可以 O(1) 查询2. 二分答案对每个查询二分第 k 个剩余偶数的序号。对于候选序号 mid它对应的偶数值是 2 * mid3. check 函数计算 nums[l..r] 中有多少个偶数 2 * mid即在 mid 之前被移除的个数用前缀和 二分定位4. 判定如果 mid - 被移除个数 k说明答案在左半区间否则在右半区间TypeScript 实现function kthRemainingInteger(nums: number[], queries: number[][]): number[] {const n nums.length;// 前缀和cnt[i] 表示 nums[0..i-1] 中偶数的个数const cnt new Array(n 1).fill(0);for (let i 0; i n; i) {cnt[i 1] cnt[i] (nums[i] % 2 0 ? 1 : 0);}const ans: number[] [];for (const [l, r, k] of queries) {// 二分答案找第 k 个剩余偶数的序号let lo 1, hi k (r - l 1); // 上界最坏情况子数组全是偶数let res hi;while (lo hi) {const mid (lo hi) 1;const evenVal 2 * mid; // 候选偶数值// 在 nums[l..r] 中找最后一个 evenVal 的位置let pos -1;let ll l, rr r;while (ll rr) {const m (ll rr) 1;if (nums[m] evenVal) {pos m;ll m 1;} else {rr m - 1;}}// 计算 nums[l..r] 中 evenVal 的偶数个数let removed 0;if (pos l) {removed cnt[pos 1] - cnt[l];}// 前 mid 个偶数中剩余个数 mid - removedif (mid - removed k) {res mid;hi mid - 1;} else {lo mid 1;}}ans.push(res * 2);}return ans;}关键点解析- 前缀和加速cnt[i1] - cnt[l] 直接得到 nums[l..i] 中偶数个数避免每次线性扫描- 二分定位 pos因为 nums 严格递增用二分找到 nums[l..r] 中最后一个 2*mid 的位置 pos从而确定被移除的偶数范围- 二分上界hi k (r - l 1)最坏情况子数组中所有元素都是偶数且都小于答案需要额外偏移 (r-l1) 个位置- 时间复杂度预处理 O(n)每个查询 O(log²n)整体 O(n q·log²n)示例验证以 nums [3,6], queries [[0,1,1],[1,1,3]] 为例- 查询 [0,1,1]移除 nums[0..1][3,6] 中的偶数 6剩余偶数 2,4,8,...第 1 个是 2- 查询 [1,1,3]移除 nums[1..1][6] 中的偶数 6剩余偶数 2,4,8,...第 3 个是 8- 输出 [2, 8] ✅这道题的核心是值域二分 前缀和快速统计要不要我帮你整理一份二分查找的通用模板方便你直接套用
返回列表