美文网首页
5643. 将数组分成三个子数组的方案数

5643. 将数组分成三个子数组的方案数

作者: 来到了没有知识的荒原 | 来源:发表于2021-01-03 16:12 被阅读0次

5643. 将数组分成三个子数组的方案数

两个都是因为边界条件,wa掉了全零的情况,比如[0,0,0,0]

两次二分

class Solution {
public:
    int waysToSplit(vector<int>& nums) {
        vector<int>sum;
        sum.push_back(0);
        for(auto i:nums)sum.push_back(sum.back()+i);
        const int MOD=1e9+7;
        int n=sum.size();
        int res=0;
        for(int i=1;i<n-2;i++){
            int left=sum[i];
            int l=i+1,r=n-2;
            while(l<r){
                int m=(l+r)>>1;
                int mid=sum[m]-sum[i];
                if(mid<left)l=m+1;
                else r=m;
            }
            int mid=sum[l]-sum[i];
            int right=sum[n-1]-sum[l];
            if(left>mid || mid>right)continue;
            int e=l;

            if(mid>=left){
                l=e,r=n-2;
                while(l<r){
                    int m=(l+r+1)>>1;
                    int mid=sum[m]-sum[i];
                    int right=sum[n-1]-sum[m];
                    if(mid<=right)l=m;
                    else r=m-1;
                }
                int mid=sum[l]-sum[i];
                int right=sum[n-1]-sum[l];
                if(left>mid || mid>right)continue;
                res=(res+l-e+1)%MOD;
            }
        }
        return res;
    }
};

双指针

class Solution {
public:
    int waysToSplit(vector<int>& nums) {
        int n=nums.size();
        int mod=1e9+7;
        int sum[n+1];
        memset(sum,0,sizeof sum);
        int res=0;
        for(int i=0;i<n;i++)sum[i+1]=sum[i]+nums[i];
        for(int i=2,j=1,k=1;i<n;i++){
            while(sum[i]-sum[j]>sum[n]-sum[i])j++;
            while(k<i && sum[k]<=sum[i]-sum[k])k++;
            int lj=sum[j],mj=sum[i]-sum[j],rj=sum[n]-sum[i];
            k--;
            k=max(j,k);
            int lk=sum[k],mk=sum[i]-sum[k],rk=sum[n]-sum[i];
            if(lj<=mj && mj<=rj && lk<=mk && mk<=rk){
                res=(res+k-j+1)%mod;
            }
        }
        return res;
    }
};

相关文章

  • 5643. 将数组分成三个子数组的方案数

    5643. 将数组分成三个子数组的方案数[https://leetcode-cn.com/problems/way...

  • 归并排序

    思想 分而治之 divide: 将数组从中间分成左右两个子数组 conquer:使用递归对子数组进行排序 comb...

  • 快排,递归,非递归,三向切分,去掉边界条件

    快排 快排的思想: 典型的分治,将数组分成两个子数组,并且分别对子数组排序,且子数组的排序也是分治。 快排和归并排...

  • 将数组拆分成固定长度数组

    #pragma mark -- 将数组拆分成固定长度 /** *将数组拆分成固定长度的子数组 * *@parama...

  • 无标题文章

    #pragma mark -- 将数组拆分成固定长度 /** *将数组拆分成固定长度的子数组 * *@parama...

  • 快速排序 D&C

    分而治之D&C(divide and conquer, D&C).步骤:1.选择基准值;2.将数组分成两个子数组:...

  • js将一个数组分成多个数组

    js将一个数组分成多个数组 1,将数组array分成长度为subGroupLength的小数组并返回新数组 fun...

  • iOS 归并排序

      归并排序(Merge Sort)原理:将当前数组拆分成两个子数组,一直拆分到每个数组只有一个元素再重新依次有序...

  • Quick sort

    快速排序是一种分治算法,将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序将数组分...

  • Cousera 公开课Princeton Algorithms

    Mergesort merge sort里的基本思路就是递归的将要排序的数组划分成两个部分,然后将这两个子数组排序...

网友评论

      本文标题:5643. 将数组分成三个子数组的方案数

      本文链接:https://www.haomeiwen.com/subject/gvouoktx.html