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

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页