当前位置: 首页 > 知识库问答 >
问题:

连续子阵和

鲁烨
2023-03-14

我在Leetcode上遇到了这个问题,我看到了解决方案,但我无法理解它为什么工作。它适用于模数的什么性质?我们怎么能说我们已经找到了一个和等于k的子数组,只看前面的模结果呢?

问题:

public boolean checkSubarraySum(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<Integer, Integer>(){{put(0,-1);}};;
    int runningSum = 0;
    for (int i=0;i<nums.length;i++) {
        runningSum += nums[i];
        if (k != 0) runningSum %= k; 
        Integer prev = map.get(runningSum);
        if (prev != null) {
        if (i - prev > 1) return true;
        }
        else map.put(runningSum, i);
    } 
    return false;
 }

共有1个答案

方昊英
2023-03-14

这实际上是一个众所周知的问题,只是对它做了一个简单的改动,如果你想的话,这里有一篇关于GFG上更简单的版本的文章:用给定的和查找子数组

总体思路是,您保留所有遇到的数字的总和,并将它们插入地图中。继续检查是否已经遇到了值actual_total_sum-target_sum(也就是说,如果您在映射中设置的值中有一个值等于actual_total_sum-target_sum),如果遇到了,您会发现自己是一个子数组,给出了所需的值。

现在,如果你明白不应该有任何问题,但让我澄清一切,以确保:

添加到映射中的数字基本上表示从0到“添加它们的索引”的所有元素的总和,因此您有指示索引[0,0]、[0,1]、[0,2]、······因此,如果您已经添加了值actual_total_sum-target_sum,则通过签入映射,您将询问“是否有一对索引[0,x]等于actual_total_sum-target_sum”如果是,这意味着子数组[x+1,actual_index]等于target_sum。

现在您应该了解了简单版本的解决方案,现在是解释LeetCode版本的解决方案的时候了。

抱歉,由于延误,解释花了一段时间写,但我希望他们足够清楚,如果没有,请不要犹豫要求澄清!

 类似资料:
  • A是一个数组,B是A中所有元素的质因数阶,< code>size(A)=N (1 到目前为止,我还没有想过这个问题,所以没有什么成就,但是我保证我已经想了很久了,希望有帮助,谢谢!

  • {4,5,1,5,7,6,8,4,1},答案是5。 对于第一个例子,子数组{5,3,1,4,2}排序后可以形成连续序列1,2,3,4,5,它们是最长的。 对于第二个示例,子数组{5,7,6,8,4}是结果子数组。

  • 我检查了用Kadane算法求最大和的连续子数组的解,我不知道为什么我们在代码中需要全局最大值(下面的代码中是global_max)。 下面是用来查找具有最大和的连续子数组的python代码

  • 问题内容: 如果我有串,我要检查,如果它作为一个连续存在 串 中,我可以使用: 在非连续子 序列 的情况下,我可以使用什么?例: 问题答案: 我不知道是否有内置功能,但是手动操作相当简单

  • NowCoder 题目描述 {6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 解题思路 // java public int FindGreatestSumOfSubArray(int[] nums) { if (nums == null || nums.length == 0) return 0;

  • 我最近遇到了一个两个指针的子数组求和问题的解决方案,我不太确定算法的正确性。子数组求和问题包括寻找一个和等于某个目标值的子数组。我见过使用哈希表解决这个问题的方法,但我质疑另一个解决方案的正确性。让我给你们一个算法的例子。 假设有一个数组[1,3,2,5,1,1,2,3],目标值x=8。 使用指示子数组开始和结束的左指针和右指针。在每一步中,左指针向前移动一步,右指针向前移动,只要子数组和至多为x