这是leetcode问题。我用下面的方法解决了它,但是它给出了堆栈溢出错误。
给定一个整数数组nums和一个整数目标。返回num的非空子序列数,使其上的最小和最大元素之和小于或等于目标。因为答案可能太大,所以返回10^9+7的模。
输入:nums=[3,5,6,7],目标=9输出:4说明:有4个子序列满足条件[3] :最小值+最大值<=目标(3+3<=9)[3,5]:(3+5<=9)[3,5,6]:(3+6<=9)[3,6]:(3+6<=9)
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);
}
}``
1条答案
按热度按时间ha5z0ras1#
我想这行会有个问题:
不过,我们可以更容易地解决这个问题,类似地使用排序,然后使用两个指针。
用b.java测试:
印刷品