Leetcode 413. 等差数列划分 --javascript

421 阅读2分钟

413. 等差数列划分

题目描述

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。

例如,以下数列为等差数列:

image.png

题解:

  • 动态规划只能应用于有最优 子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。

  • 简单地说,问题能够分解成子问题来解决

  • 通俗一点来讲,动态规划和其它遍历算法(如深/广度优先搜索)都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存子问题的解,避免重复计算

  • 解决动态规划问题的关键是找到状态转移方程,这样我们可以通计算和储存子问题的解来求解最终问题

  • 同时,我们也可以对动态规划进行空间压缩,起到节省空间消耗的效果。

  • 在一些情况下,动态规划可以看成是带有状态记录(memoization)的优先搜索

  • 动态规划是自下而上的,即先解决子问题,再解决父问题;

  • 而用带有状态记录的优先搜索自上而下的,即从父问题搜索到子问题,若重复搜索到同一个子问题则进行状态记录,防止重复计算。

  • 如果题目需求的是最终状态,那么使用动态搜索比较方便;

  • 如果题目需要输出所有的路径,那么使用带有状态记录的优先搜索会比较方便。

等差数列:num[i] - num[i-1] = num[i-1] - num[i-2]。 dp[i] = dp[i-1] + 1 在最后需要对 dp 数组求和。

coding

/**
 * @param {number[]} nums
 * @return {number}
 */
var numberOfArithmeticSlices = function(nums) {
  let len = nums.length;
  if(len < 3) return 0;
  const dp = Array.from({length: len}, ()=> 0);
  let result = 0;
  for(let i = 2; i < len; i++) {
      if(nums[i] - nums[i-1] === nums[i-1] - nums[i-2]) {
          dp[i] = dp[i-1] + 1;
          result +=dp[i];
      }
  }
  return result;
};