题目描述1
笔者分析1.1
开始觉得这道题每三个数都是必须要相加比较的,也确实是。但是可以将同一个值的数数量累加,这样也能快捷许多,而且用两层for循环就能实现,值得注意的是用排列组合求数量是有多种情况要分类讨论。不过,秀还是秀的,时间效率超过百分之百。
class Solution {
public int threeSumMulti(int[] A, int target) {
int kMaxN=100;
int mod=(int)Math.pow(10,9)+7;
long[]c=new long[kMaxN+1];
for(int i=0;i<A.length;i++){
c[A[i]]++;
}
long ans=0;
for(int i=0;i<=target;i++){
for(int j=i;j<=target;j++){
int k=target-i-j;
if(k<0||k>c.length||k<j)continue;
if(i<0||i>100||j<0||j>100||k<0||k>100)continue;
if(i==j&&j==k){
ans+=(c[i]-2)*(c[i]-1)*c[i]/6;
}
else if(i==j&&j!=k)
ans+=c[i]*(c[i]-1)/2*c[k];
else if(i!=j&&j==k)
ans+=c[i]*(c[j]-1)*c[j]/2;
else
ans+=c[i]*c[j]*c[k];
}
}
return (int)(ans%mod);
}
}
题目描述2
笔者分析2.1
可以将题目改成奇数为1, 偶数为0, 子区间和为k的种类数的题,这样就可以用动态规划思想快速解题了。
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int n=nums.length;
for(int i=0;i<n;i++){
if(nums[i]%2==1)nums[i]=1;
else nums[i]=0;
}
Map<Integer,Integer> map=new HashMap<>();
int sum=0;
map.put(0,1);
int res=0;
for(int i=1;i<=n;i++){
sum+=nums[i-1];
if(map.containsKey(sum-k))
res+=map.get(sum-k);
map.put(sum,map.getOrDefault(sum,0)+1);
}
return res;
}
}
总结
将题归类,三for可去一for,每日打卡二十六天,以下图为证