LeetCode每日十题---双指针

题目描述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,每日打卡二十六天,以下图为证
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路的苟狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值