当前位置: 首页 > article >正文

和为 K 的子数组(java)

题目描述:

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 

子数组是数组中元素的连续非空序列

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

代码思路: 

class Solution {
    public int subarraySum(int[] nums, int k) {
        int sum = 0;
        int count = 0;
        for(int i=0;i<nums.length;i++){
            sum = nums[i];
            if(sum==k){
                count++;
            }
            int j=i+1;
            while(j<nums.length){
                sum = sum+nums[j];
                if(sum==k){
                    count++;
                }
                j++;
            }
        }
        return count;
    }
}

官方思路

解题方案一:

public class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0;
        for (int start = 0; start < nums.length; ++start) {
            int sum = 0;
            for (int end = start; end >= 0; --end) {
                sum += nums[end];
                if (sum == k) {
                    count++;
                }
            }
        }
        return count;
    }
}

 

解题方案二:

使用前缀和的方法可以解决这个问题,因为我们需要找到和为k的连续子数组的个数。通过计算前缀和,我们可以将问题转化为求解两个前缀和之差等于k的情况。

假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位置到第i个位置的元素之和。那么对于任意的两个下标i和j(i < j),如果prefixSum[j] - prefixSum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。

通过遍历数组,计算每个位置的前缀和,并使用一个哈希表来存储每个前缀和出现的次数。在遍历的过程中,我们检查是否存在prefixSum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,我们将对应的次数累加到结果中。

这样,通过遍历一次数组,我们可以统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。

public class Solution {
public static int subarraySum(int[] nums, int k) {
        int count = 0;
        int sum = 0;
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 1); // 初始化前缀和为0的次数为1
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (map.containsKey(sum - k)) {
                count += map.get(sum - k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}


http://www.kler.cn/a/405603.html

相关文章:

  • 使用 FFmpeg 提取音频的详细指南
  • ChatClient:探索与AI模型通信的Fluent API
  • MongoDB 更新集合名
  • Kafka Offset 自动提交和手动提交 - 漏消费与重复消费
  • php:使用socket函数创建WebSocket服务
  • 项目虚拟机配置测试环境
  • shell循环
  • MinGW 与 MSVC 的区别与联系及相关特性分析
  • 小兔鲜项目总结——项目亮点
  • 神经网络问题之二:梯度爆炸(Gradient Explosion)
  • 双指针算法详解:原理、应用场景及代码示例
  • 基于 ESP-AT (v3.x)固件通过 AT+SYSMFG 指令更新证书设置
  • 深述C++模板类
  • 每天五分钟深度学习:神经网络模型的直观理解
  • 前端常用内容
  • 汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力
  • 《Qt Creator:人工智能时代的跨平台开发利器》
  • 特殊 ABAP SQL 表达式 NULL
  • 【论文复现】语言模型中的多模态链式推理
  • springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)
  • Vm桥接模式下的网卡选择
  • 【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
  • 16. 【.NET 8 实战--孢子记账--从单体到微服务】--汇率获取定时器
  • 如何在Linux上安装Canal同步工具
  • JDBC编程---Java
  • 完全竞争市场