Dynamic Programming学习笔记 (49) - 等差数列划分 (力扣# 413)

140 阅读1分钟

本题出自力扣题库第413题。题面大意如下:

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给定一个整数数组 nums ,返回数组 nums中所有为等差数组的子数组个数。

示例:

输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3][2, 3, 4][1,2,3,4] 自身。

题解:

本题的基本思路在于使用一个变量diff来记录当前的相邻元素之差,初始值为nums[1] - nums[0],以及一个变量sliceLen来记录连续等差数列的长度,初始值为1,然后通过一个循环来依次计算数组中的各个元素与之前元素的差,如果结果与diff不相同,修改diff的值并重置sliceLen为2;如果相同则表明连续的等差数列长度在增加,所以递增sliceLen,当sliceLen等于或大于超过3时,符合条件的子数组数量就增加sliceLen - 2个。

Java代码如下:

class Solution {
    public int numberOfArithmeticSlices(int[] nums) {
        int N = nums.length;
        if (N < 3) {
            return 0;
        }

        int count = 0;

        int diff = nums[1] - nums[0];
        int sliceLen = 2;
        for (int i = 2; i < N; i ++) {
            int t = nums[i] - nums[i - 1];
            if (t == diff) {
                sliceLen ++;
                if (sliceLen >= 3) {
                    count += (sliceLen - 2);
                }
            } else {
                sliceLen = 2;
                diff = t;
            }
        }

        return count;
    }
}