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

从等于某个值X的数组中找到子数组

巩枫
2023-03-14

您将得到一个包含正数和负数的数组。你要在数组中找到一个子数组,它等于某个值X。输入是数组和X值。输出是子数组的开始和结束索引。

Array = [2,6,0,9,7,3,1,4,1,10] 
X = 15
Output = [1,3]

下面是我在geeks4geeks上找到的代码

  public static void subArraySum(int[] arr, int n, int sum) { 
        //cur_sum to keep track of cummulative sum till that point 
        int cur_sum = 0; 
        int start = 0; 
        int end = -1; 
        HashMap<Integer, Integer> hashMap = new HashMap<>(); 

        for (int i = 0; i < n; i++) { 
            cur_sum = cur_sum + arr[i]; 
            //check whether cur_sum - sum = 0, if 0 it means 
            //the sub array is starting from index 0- so stop 
            if (cur_sum - sum == 0) { 
                start = 0; 
                end = i; 
                break; 
            } 
            //if hashMap already has the value, means we already  
            // have subarray with the sum - so stop 
            if (hashMap.containsKey(cur_sum - sum)) { 
                start = hashMap.get(cur_sum - sum) + 1; 
                end = i; 
                break; 
            } 
            //if value is not present then add to hashmap 
            hashMap.put(cur_sum, i); 

        } 
        // if end is -1 : means we have reached end without the sum 
        if (end == -1) { 
            System.out.println("No subarray with given sum exists"); 
        } else { 
            System.out.println("Sum found between indexes " 
                            + start + " to " + end); 

共有1个答案

家浩瀚
2023-03-14

sum-是我们想要实现的数字

cur_sum-是迄今为止数组中所有元素的总和

假设cur_sum-sum=x

由于我们已经知道cur_sum-sum=x,这意味着从i+1开始,到当前索引结束的子数组和正好是sum

让我们以您发布的示例为例:

Array = [2,6,0,9,7,3,1,4,1,10] 
X = 15
Output = [1,3]

让我们迭代数组:
索引0:SUM2=>用(0:2)更新地图
索引1:SUM2+6=8=>用(1:8)更新地图
索引2:SUM2+6+0=8=>用(2:8)更新地图
索引3:SUM2+6+0+9=17=>

 类似资料:
  • 本文向大家介绍在C ++中找到一个数字X,其数字之和等于N,包括了在C ++中找到一个数字X,其数字之和等于N的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将找到一个数字,其中一些(包括其数字)等于给定的数字N。 这个想法很简单,我们将检查给定数字的左右100个数字。N≤1000000000且总和不超过100不会被限制。 让我们看看解决问题的步骤。 初始化号码。 编写一个循环100次的

  • 我们将如何测试数组中每个子数组的长度等于子数组元素之和的P倍的所有子数组组合。 一个简短的示例:编辑: 期望的结果: 长度=2,P*元素之和=1。子序列是 编辑约束: 这些问题属于什么样的问题集(例如:NP-hard?)?语言:C#

  • 问题内容: 如果我有一个PHP数组: 带有值: 我有一个变量: 如何返回值?: 因为那是数组中最接近38(递增)的值? 问候, 泰勒 问题答案:

  • 给定一个有N个整数的数组A,我们需要找到子数组的最高和,使得每个元素小于或等于给定的整数X 示例:设 N=8 且数组为 [3 2 2 3 1 1 1 3] 。现在,如果 x=2,那么如果我们考虑 1 个基本索引,则通过求和 A[2] A[3] 来回答 4。如何在 O(N) 或 O(N*logN) 中执行此问题 目前,我通过检查每个可能的子阵列来采用O(N^2)方法。如何降低复杂性?

  • 从一个布尔数组中找到第i个布尔值,例如:数组是{true, true, false, false, true},该方法将输出int,显示第3个true值,即4。 我已经尝试过一些代码,它可以工作,但我需要使用递归,而不是while函数。