想要精通算法和SQL的成长之路 - 连续的子数组和

想要精通算法和SQL的成长之路 - 连续的子数组和

  • 前言
  • [一. 连续的子数组和](#一. 连续的子数组和)
    • [1.1 最原始的前缀和](#1.1 最原始的前缀和)
    • [1.2 前缀和 + 哈希表](#1.2 前缀和 + 哈希表)

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 连续的子数组和

原题链接

1.1 最原始的前缀和

如果这道题目,用前缀和来算,我们的思路一般是这样:

  1. 计算这个数组的前缀和。
  2. 循环遍历数组的每个元素,以每个元素作为起点,向后寻找第二个元素(索引至少是起点+2)作为终点,计算两者的区域和。再判断是否满足条件。

那么这样的代码写出来就是这样:

java 复制代码
public boolean checkSubarraySum(int[] nums, int k) {
    int n = nums.length;
    // 计算前缀和
    int[] preSum = new int[n + 1];
    for (int i = 0; i < n; i++) {
        preSum[i + 1] = preSum[i] + nums[i];
    }
    // i 遍历到 preSum。length -2 即可,
    for (int i = 0; i < n - 1; i++) {
        // 区间长度 > 2
        for (int j = i + 2; j <= n; j++) {
            // 前缀和差即是[i,j]之间的区域和
            int diff = preSum[j] - preSum[i];
            if (diff % k == 0) {
                return true;
            }

        }
    }
    return false;
}

结果如下:

1.2 前缀和 + 哈希表

我们从这段代码入手:

java 复制代码
int diff = preSum[j] - preSum[i];
if (diff % k == 0) {
    return true;
}

即:

  • (preSum[j] - preSum[i] ) % k = 0;
  • preSum[j] % k == preSum[i] % k;

那么我们只需要利用哈希表,记录每个前缀和对于k的一个取模值是多少即可,1. 存储的是它们的下标。

  1. 如果遇到取模值相同的,并且两个下标差 > 2,就满足条件。

那么代码优化:

java 复制代码
public boolean checkSubarraySum(int[] nums, int k) {
    int n = nums.length;
    // 计算前缀和
    int[] preSum = new int[n + 1];
    for (int i = 0; i < n; i++) {
        preSum[i + 1] = preSum[i] + nums[i];
    }
    HashSet<Integer> set = new HashSet<>();
    for (int i = 2; i <= n; i++) {
        set.add(preSum[i - 2] % k);
        if (set.contains(preSum[i] % k)) {
            return true;
        }
    }
    return false;
}
相关推荐
生成论实验室2 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第八篇:认知与反思关系——探索、定位与延续
人工智能·算法·架构·知识图谱·创业创新
xiaoye370824 分钟前
Spring 事务传播机制 + 隔离级别
java·后端·spring
YaraMemo24 分钟前
一文带你区分全局最优解和帕累托最优解
算法·5g·信息与通信·信号处理
白夜111734 分钟前
C++(标签派发 Tag Dispatching)
开发语言·c++·笔记·算法
Arya_aa39 分钟前
数据字典模块–JSR303参数校验
java
weoptions43 分钟前
简单sql注入中如何通过简单语句判断注入类型&注入方法
数据库·sql
小短腿的代码世界1 小时前
Qt数据库编程深度解析:从SQL基础到ORM架构设计
数据库·sql·qt
YaraMemo1 小时前
数学优化问题中的三大转化:多目标转化为单目标,多变量转化为单变量,有约束转化为无约束
人工智能·算法·5g·信息与通信·信号处理
Ailan_Anjuxi1 小时前
【附Python源码】使用minGPT训练自己的小型GPT语言模型
算法
明月(Alioo)1 小时前
给 AI Agent 装上“大脑“:Java语言中Code Interpreter 的设计与实现
java·ai·agent