【算法】前缀和(二)使用

【算法】前缀和(二)使用

文章目录

 一、问题直化前缀和

1.拆拼

二、问题转用前缀和

1.模减消实质

2.同余定理

2.1证明

3.取模%

3.1计算机

3.1.1向零取整 相除

3.1.2符号

3.2数学

3.2.1向下取整 相除

3.2.2符号

3.3两者关系

3.3.1差异

3.3.2转化


上篇:【算法】前缀和(一)原理

一、问题直化前缀和

238. 除自身以外数组的乘积 - 力扣(LeetCode)

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4] 输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]

提示:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 输入 保证 数组 answer[i] 在  32 位 整数范围内

1.拆拼

整体 拆分 能同类累积部分拼合

public int[] productExceptSelf(int[] nums) { int n = nums.length; int[] f = new int[n], g = new int[n], ret = new int[n]; f[0] = g[n - 1] = 1; for (int i = 1; i < n; i++) f[i] = f[i - 1] * nums[i - 1]; for (int i = n - 2; i >= 0; i--) g[i] = g[i + 1] * nums[i + 1]; for (int i = 0; i < n; i++) ret[i] = f[i] * g[i]; return ret; }

二、问题转用前缀和

974. 和可被 K 整除的子数组 - 力扣(LeetCode)

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的非空 子数组 的数目。

子数组 是数组中 连续 的部分。

示例 1:

输入:nums = [4,5,0,-2,-3,1], k = 5 输出:7 解释: 有 7 个子数组满足其元素之和可被 k = 5 整除: [4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

示例 2:

输入: nums = [5], k = 9 输出: 0

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • 2 <= k <= 104

1.模减消实质

(a + p*k) % p = a % p


2.同余定理

差被(a - b) % p = 0 or (a - b) / p = k 

=> 减数 模 除数 相等a % p = b % p

2.1证明

(a - b) / p = k

-> a - b = p*k

 -> a = b + p*k

  -> a % p = (b + p*k) % p

   -> a % p = b % p


3.取模%

3.1计算机

3.1.1向零取整 相除

余数绝对值最接近0 地相除

3.1.2符号

同被除数


3.2数学

3.2.1向下取整 相除

余数正值最接近0 地相除

3.2.2符号

正数


3.3两者关系

3.3.1差异

只有 负 % 正负数取模结果会不同(计算机为负、数学为正)

3.3.2转化

计算机 相同等效、不同转化 为 数学 的模结果:(a % p + p) / p

public int subarraysDivByK(int[] nums, int k) { Map<Integer,Integer> map = new HashMap<>(); int sum = 0, ret = 0; map.put(0,1); // sum = k,sum % k = 0,自己整的区间可以被k整除的是结果,自己整的就是结果,但往前减区间来得 是得不到的,得特判为就是结果地 就开始累积 for (int i = 0; i < nums.length; i++) { sum += nums[i]; int r = (sum % k + k) % k; // 找满足的前缀和: ret += map.getOrDefault(r,0); // (sum - x) % k = 0 => sum % k = x % k,往前找 已存进哈希表里的 前缀和x % k的模 有多少个 等于 当前总区间前缀和sum % k的模 // 存前缀和: map.put(r, map.getOrDefault(r,0) + 1); } return ret; }

Read more

YOLO训练数据去重:使用GPU加速哈希比对

YOLO训练数据去重:使用GPU加速哈希比对 在构建高性能目标检测模型的实践中,我们常常把注意力集中在网络结构优化、超参数调优和推理部署上,却容易忽略一个“不起眼”但影响深远的问题——训练数据中的重复样本。 想象这样一个场景:你正在为一条自动化产线开发缺陷检测系统,采集了超过50万张工业图像。经过初步整理后开始训练YOLOv8模型,却发现验证精度始终徘徊在某个瓶颈,loss曲线频繁震荡,甚至出现过拟合迹象。排查许久才发现,由于设备自动连拍机制和流水线周期性运动,数据集中竟有近三成是高度相似或完全重复的样本。更糟糕的是,这些冗余数据不仅浪费了标注成本和存储资源,还让模型“反复背诵同一道题”,严重削弱其泛化能力。 这类问题在真实项目中极为普遍。而传统依赖CPU逐帧比对的去重方案,在面对数十万级图像时往往需要数小时甚至更久,成为整个MLOps流程中的卡点环节。幸运的是,现代GPU的强大并行计算能力为我们提供了破局之道。 从YOLO的需求反推数据质量标准 YOLO系列之所以能在工业界站稳脚跟,核心在于它将目标检测转化为端到端的回归任务,实现了高帧率与合理精度的平衡。以YOLOv8为例

By Ne0inhk
我爱学算法之—— 前缀和(中)

我爱学算法之—— 前缀和(中)

一、724. 寻找数组的中心下标 题目解析 这道题,给定数组nums,要求我们找出这个数组的中心下标。 **中心下标:**指左侧所有元素的和等于右侧所有元素的和。 如果存在多个中心数组下标,就返回最左侧的中心数组下标。 算法思路 暴力解法: 对于这道题,要找出数组的中心下标,暴力解法就是遍历数组,依次判断该位置中心下标(左侧所有元素等于右侧所有元素)。 对于暴力解法,遍历数组nums; 遍历到i位置时,判断该位置是否是中心下标,也就是该位置左侧所有元素是否等于右侧所有元素。 优化: 暴力解法要遍历数组,遍历到i位置时还需求左侧所有元素的和、右侧所有元素的和,就还需再遍历数组来求。 时间复杂度就是O(n);对于遍历数组的每一个元素,依次判断该位置是否是中心下标,这里进行不了优化; 那就来看:遍历到i位置时,求左侧所有元素的和、右侧所有元素的和 在暴力解法中,我们就遍历i位置左侧的所有元素,求左侧所有元素的和;遍历i位置右侧所有元素的和,求右侧所有元素的和。 我们可不可以使用更简单的方法来拿到i位置所有元素的和? 当然是可以的,我们可以预先处理前缀和与后

By Ne0inhk
计算机视觉热点:三维人体姿态估计的前沿算法与论文案例

计算机视觉热点:三维人体姿态估计的前沿算法与论文案例

计算机视觉热点:三维人体姿态估计的前沿算法与论文案例 * 一、前言 * 二、三维人体姿态估计概述 * 2.1 定义与目标 * 2.2 应用场景 * 2.3 面临的挑战 * 三、前沿算法介绍 * 3.1 基于深度学习的方法 * 3.2 多视角方法 * 3.3 结合传感器的方法 * 四、算法对比与分析 * 4.1 不同算法的性能比较 * 4.2 适用场景分析 * 五、数据集介绍 * 5.1 常用数据集概述 * 5.2 数据集特点与应用 * 六、未来发展趋势 * 6.1 算法优化方向 * 6.2 新兴技术融合

By Ne0inhk
15.8【保姆级教程】C语言链式结构(链表):从0到1吃透单链表/双向链表,手写完整实战案例

15.8【保姆级教程】C语言链式结构(链表):从0到1吃透单链表/双向链表,手写完整实战案例

🔥 关注博主不迷路!纯干货+可视化图解+完整可运行代码 | 解决数组痛点,掌握队列/二叉树的核心基础 在C语言中,链式结构(链表) 是突破数组“固定长度、插入删除低效”痛点的核心数据结构,也是实现队列、栈、二叉树、哈希表等高级数据结构的基础。不同于数组的连续内存布局,链式结构通过“指针”将分散的内存节点串联起来,实现数据的动态增删,是C语言进阶必须吃透的核心知识点。 本文将从“链式结构的核心认知”到“单链表完整实现”,再到“双向链表进阶”和“实战案例”,手把手拆解每一行代码、每一个逻辑,即使是零基础新手,也能轻松掌握链式结构的所有核心用法! 一、链式结构核心认知:为什么需要它? 1.1 数组的痛点(链式结构的诞生背景) 在学习链表前,先明确“为什么不用数组”——数组的三大致命缺陷: 数组的痛点具体问题长度固定声明时必须指定长度(如int arr[

By Ne0inhk