Day8——LeetCode2145.统计隐藏数组的数目

1 题目描述(LeetCode)

  今天课有点多晚上才有时间刷题,因此该文也尽可能简短节约时间,只作为本人打卡使用。
  ok这是LeetCode每日一题,题目描述如下:
1
  也就是给定一个为原数组相邻元素差值的数组,以及一个闭区间,要求还原所有可能的数组,且数组中的数在闭区间内。

2 题目解决

  首先写了一个暴力方法,结果就是超时了。因此需要使用别的算法。这里仔细观察了定义的differences数组,我们可以发现,若原数组为[a,b,c,d],则differences[b-a,c-b,d-c],这样我们就发现,若想计算不相邻元素的差值,只需将differences对应位置相加即可。例如计算d-b=differences[2]+differences[1]。所以我们可以固定一个元素,不妨为隐藏数组的第一个值,我们不需要知道它的具体值,只需要计算其余元素与其的差值,即可判断出隐藏数组中的最大值和最小值(通过将differences不断累加即可),以及最大值与最小值之间的固定差值。有了这个信息,我们只需要保证最大最小值在区间内,且它们差值为所求的固定差值,通过滑动最大最小值即可求出隐藏数组的个数。
  注意隐藏数组累加数比较大,用int溢出了,因此用long long成功通过:

class Solution {
public:
    int numberOfArrays(vector<int>& differences, int lower, int upper) {
        int ans=0;
        int n=differences.size();
        //记录与hidden[0]的最大差值,也就是hidden的最大值
        long long hidden_max=0;
        //记录与hidden[0]的最小差值,也就是hidden的最小值
        long long hidden_min=0;
        
        long long diff_sum=0;

        for(int i=0;i<n;i++){
            diff_sum=diff_sum+differences[i];
            hidden_max=max(hidden_max,diff_sum);
            hidden_min=min(hidden_min,diff_sum);
        }
        //保证最大值与最小值在区间内,且二者的差值固定即可
        ans=upper-lower-(hidden_max-hidden_min)+1;
        return ans>0?ans:0;

    }
};

  可以看到时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。今天就到这里,主播继续刷题复习去了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值