LeetCode 413.等差数列

https://leetcode.cn/problems/arithmetic-slices
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

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

思路一:暴力解法
遍历数组的每一个至少三个的子数组,暴力找出所有的等差数组

var numberOfArithmeticSlices = function(nums) {
    let len = nums.length;
    let result = 0

    for (let i = 0; i < len - 2; i++) {
        for (let j = i + 1; j < len; j++) {
            if (isArithmetic(nums, i, j)) {
                result++;
            }
        }
    }

    return result; 
};

var isArithmetic = function(nums, start, end) {
    if (end - start < 2) return false;
    for (let i = start; i < end - 1; i++) {
        if (nums[i] + nums[i + 2] !== 2 * nums[i + 1]) {
            return false;
        }
    }
    return true;
}

思路二:双指针法(滑动窗口)
对于每一组子数组,等差都是一定的。如果对于 j 的循环中,等差与 i 中循环中不等,那也就没有必要循环了,需要寻找下一个子数组。

var numberOfArithmeticSlices = function(nums) {
    let len = nums.length;
    let result = 0;
    for (let i = 0; i < len - 2; i++) {
        let d = nums[i + 1] - nums[i];
        for (let j = i + 1; j < len; j++) {
            if ((nums[j + 1] - nums[j]) === d) {
                result++;
            } else {
                break;
            }
        }
    }
    return result;
};

思路三:动态规划
设dp[i]为在 i 位置所有等差数列的数量,最终结果是dp这个数组中所有项的和

var numberOfArithmeticSlices = function(nums) {
    let len = nums.length;
    let dp = new Array(len).fill(0);
    for (let i = 1; i < len - 1; i++) {
        if (nums[i + 1] - nums[i] === nums[i] - nums[i - 1]) {
            dp[i] = dp[i - 1] + 1;
        }
    }

    return dp.reduce( (prev, curr) => prev + curr);
};

你可能感兴趣的:(leetCode刷题,leetcode,算法,职场和发展)