想要精通算法和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;
}

即:

  • (preSumj - preSumi ) % k = 0;
  • preSumj % k == preSumi % 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;
}
相关推荐
横木沉8 分钟前
IntelliJ IDEA 无法识别 Git:Git is not installed 问题解决
java·git·github·intellij-idea
code2cat20 分钟前
Java进阶篇之Optional
java
万物智能23 分钟前
PWM散热风扇设置—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
前端·后端·算法
隔窗听雨眠26 分钟前
SQL分页优化深度实战:从深分页性能瓶颈到等价改写完整方案
sql·sql优化
用户81818706274632 分钟前
第29章 死信队列与延迟消息实战
java·后端
专业程序开发源33 分钟前
springboot旅游推荐系统82074-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·php·课程设计·旅游
步行cgn34 分钟前
Spring 注入值中含有特殊符号的处理详解
java·后端·spring
user_admin_god36 分钟前
第 11 篇:实践三 —— 表单 / 合同字段抽取
java·人工智能·spring boot·语言模型
北极有牛36 分钟前
cuda算子--矩阵转置
人工智能·算法
未秃头的程序猿36 分钟前
全链路追踪落地一年:从翻日志到秒级定位,我们都做了什么
java·后端·面试