560. 和为K的子数组

简介: 560. 和为K的子数组

正文


一、题目描述


给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明 :

数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

二、解答


class Solution {
  public int subarraySum(int[] nums, int k) {
       int[] dpArr = new int[nums.length];
      int count = 0;
      for (int i = 0; i < nums.length; i++) {
           for (int m = i; m >= 0; m--) {
              if (i - 1 >= 0) {
                   dpArr[m] = dpArr[m] + nums[i];
               } else {
                   dpArr[m] = nums[i];
               }
              if (dpArr[m] == k) {
                   count++;
               }
           }
       }
      return count;
   }
}


三、超过内存限制的解答


class Solution {
   public int subarraySum(int[] nums, int k) {
       int[][] dpArr = new int[nums.length][nums.length];
       int count = 0;
       for (int i = 0; i < nums.length; i++) {
           for (int m = i; m >= 0; m--) {
               if (i - 1 >= 0) {
                   dpArr[i][m] = dpArr[i - 1][m] + nums[i];
              } else {
                   dpArr[i][m] = nums[i];
              }
               if (dpArr[i][m] == k) {
                   count++;
              }
          }
      }
       return count;
  }
}


四、代码思路


首先当前的操作是具有无后效性的,所以可以考虑用动态规划,因为,使用动态规划最重要的是找到状态的转移方程。根据代码可以知道,我们dpArr[i]存储的就是当前nums[i]位置的情况,之后,直接判断,就可以得到我们的答案。

相关文章
|
8天前
|
算法 Java
【动态规划】子数组系列(上)
【动态规划】子数组系列(上)
8 1
|
8天前
|
算法 Java
【动态规划】子数组系列(下)
【动态规划】子数组系列(下)
9 0
|
8天前
|
测试技术
leetcode-152:乘积最大子数组
leetcode-152:乘积最大子数组
30 0
|
8天前
leetcode-560:和为 K 的子数组
leetcode-560:和为 K 的子数组
26 0
|
8天前
leetcode-2104:子数组范围和
leetcode-2104:子数组范围和
23 0
|
9月前
|
人工智能
LeetCode-2104 子数组范围和
LeetCode-2104 子数组范围和
|
9月前
|
存储 算法 Linux
【前缀和】560.和为 K 的子数组
暴力解法:我们很容易想到通过两个for循环去遍历数组中所有和的可能,之后来判断有几个满足K.他的代码十分的简单,所以这里直接给出.
33 0
|
9月前
力扣 713. 乘积小于 K 的子数组
力扣 713. 乘积小于 K 的子数组
39 0
|
9月前
|
存储 算法 Linux
【前缀和】974. 和可被 K 整除的子数组
同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.
35 0

热门文章

最新文章