leetcode刷题 413等差数列划分

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。

给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

子数组 是数组中的一个连续序列。

解题思路:

        设置一个arr数组,其中arr[i]表示以nums[i]为结尾的等差数列子数组的总个数,假设nums=[1,2,3,4,6,7,8],则arr=[0,0,1,2,0,0,1],而最终要返回的答案实际上就是arr数组中所有数值的和。因此我们的任务就是要构造arr数组。

        当(nums[i]-nums[i-1]) !=(nums[i -1]-nums[i-2])时,很明显arr[i]就是0。

        当(nums[i]-nums[i-1])==(nums[i -1]-nums[i-2])时,此时arr[i]的值与arr[i-1]的值相关。能发现,只要在以nums[i-1]为结尾的所有等差数列子数组后添加一个nums[i],就能形成新的一系列以nums[i]为结尾的等差数列子数组,即我们可以得到arr[i-1]个以nums[i]为结尾的数组。此外,还要在arr[i-1]的基础上再增加1,因为{nums[i-2],nums[i-1],nums[i]}是满足要求的子数组,但在计算arr[i-1]时,{nums[i-2],nums[i-1]}虽然以nums[i-1]结尾但并不算时等差数组。

        也就是说,当(nums[i]-nums[i-1])==(nums[i -1]-nums[i-2])时,arr[i]=arr[i-1]+1。

代码如下:

                 

    public int numberOfArithmeticSlices(int[] nums) {
        int[] arr = new int[nums.length];
        int res = 0;
        for (int i = 2; i < nums.length; i++) {
            if (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {
                arr[i] = arr[i - 1] + 1;
            } else {
                arr[i] = 0;
            }
            res += arr[i];
        }
        return res;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值