有人可以指出代码“满足给定总和条件的子序列数”的错误,这会导致堆栈溢出错误

Posted

技术标签:

【中文标题】有人可以指出代码“满足给定总和条件的子序列数”的错误,这会导致堆栈溢出错误【英文标题】:Can someone please point out error for the code "Number of Subsequences That Satisfy the Given Sum Condition" which is giving stack overflow error 【发布时间】:2021-03-02 11:42:30 【问题描述】:

这是 leetCode 问题。我使用以下方法解决了它,但它给出了堆栈溢出错误。

给定一个整数数组 nums 和一个整数目标。 返回 nums 的非空子序列的数量,使得其上的最小和最大元素之和小于或等于目标。 由于答案可能太大,因此以 10^9 + 7 为模返回。 输入:nums = [3,5,6,7],目标 = 9 输出:4 解释:有 4 个子序列满足条件。 [3] : 最小值 + 最大值

enter code here:

import java.lang.Math;
class Solution 
static int maxIndex=0;
static long M=1000000007;
public int numSubseq(int[] nums, int target) 
Arrays.sort(nums);
maxIndex=nums.length-1;
return numSubseq(nums,target,0);


public int numSubseq(int[] nums,int target, int i)
 if(target==0 || nums.length==0 || i==nums.length)
return 0;
int res=0;
if(2*nums[i]<=target)
     res=1;
    if(nums[i]<nums[maxIndex])
        int j=maxIndex;
        while(j>i)
         if(nums[i]+nums[maxIndex]<=target)
             break;
            j--;
        
        maxIndex=j;
        if(nums[i]+nums[maxIndex]<=target && i!=maxIndex) 
        
            int diffIndex=maxIndex-i;
            res+=Math.pow(2,diffIndex)-1;
        
        
       
   
      else
           return 0;
     
      return (int)((res+numSubseq(nums,target,i++))%M);
   
``

【问题讨论】:

嗨,您能否更详细地解释一下代码试图解决的问题,并显示一些示例输入和输出?您还可以解释解决您试图在代码中实现的问题的一般方法吗?例如,为什么代码使用递归?还请整齐地格式化您的代码,以便容易看到括号是如何排列的。 我发现非子序列包含数组 nums 中的第一个数字,其余非零子序列的数量是使用递归获得的。 请提供minimal reproducible example 来演示问题。我建议使用硬编码输入。 【参考方案1】: 我猜这行这里会有问题:
return (int)((res+numSubseq(nums,target,i++))%M);
不过,我们可以更轻松地解决这个问题,类似地使用排序,然后使用两个指针。

使用b.java 进行测试:

import java.util.*;

class Solution 
    private static final int MOD = (int)1e9 + 7;
    public static final int numSubseq(
        final int[] nums,
        final int target
    ) 
        Arrays.sort(nums);
        int[] pows = new int[nums.length];
        pows[0] = 1;

        int subsequences = 0;
        int left = 0;
        int right = nums.length - 1;

        for (int index = 1 ; index < nums.length ; ++index) 
            pows[index] = pows[index - 1] * 2;
            pows[index] %= MOD;
        

        while (left <= right) 
            if (nums[left] + nums[right] > target) 
                --right;

             else 
                subsequences += pows[right - left++];
                subsequences %=  MOD;
            
        

        return subsequences;
    



class b 
    public static void main(String[] args) 
        System.out.println(new Solution().numSubseq(new int[] 3, 5, 6, 7, 9));
        System.out.println(new Solution().numSubseq(new int[] 3, 3, 6, 8, 10));
        System.out.println(new Solution().numSubseq(new int[] 2, 3, 3, 4, 6, 7, 12));
        System.out.println(new Solution().numSubseq(new int[] 5, 2, 4, 1, 7, 6, 8, 16));
    

打印

4
6
61
127

【讨论】:

以上是关于有人可以指出代码“满足给定总和条件的子序列数”的错误,这会导致堆栈溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

有人可以指出为啥我的 require_once() 函数找不到路径吗? php

std :: shared_ptr的错误用法,有人可以帮忙指出问题所在吗?

分析 php,有人可以指出我的白痴指南吗?

我无法理解如何实现“结果回调”。有人可以指出我正确的方向吗?

有人能指出这个表单验证有啥问题吗?

分析php代码报502的错