Leetcode 413. 等差數列劃分 --javascript

413. 等差數列劃分

題目描述

若是一個數列至少有三個元素,而且任意兩個相鄰元素之差相同,則稱該數列爲等差數列。算法

例如,如下數列爲等差數列:數組

image.png

題解:

  • 動態規劃只能應用於有最優 子結構的問題。最優子結構的意思是局部最優解能決定全局最優解(對有些問題這個要求並不能徹底知足,故有時須要引入必定的近似)。markdown

  • 簡單地說,問題可以分解成子問題來解決spa

  • 通俗一點來說,動態規劃和其它遍歷算法(如深/廣度優先搜索)都是將原問題拆成多個子問題而後求解,他們之間最本質的區別是,動態規劃保存子問題的解,避免重複計算code

  • 解決動態規劃問題的關鍵是找到狀態轉移方程,這樣咱們能夠通計算和儲存子問題的解來求解最終問題orm

  • 同時,咱們也能夠對動態規劃進行空間壓縮,起到節省空間消耗的效果。it

  • 在一些狀況下,動態規劃能夠當作是帶有狀態記錄(memoization)的優先搜索io

  • 動態規劃是自下而上的,即先解決子問題,再解決父問題;table

  • 而用帶有狀態記錄的優先搜索自上而下的,即從父問題搜索到子問題,若重複搜索到同一個子問題則進行狀態記錄,防止重複計算。function

  • 若是題目需求的是最終狀態,那麼使用動態搜索比較方便;

  • 若是題目須要輸出全部的路徑,那麼使用帶有狀態記錄的優先搜索會比較方便。

等差數列: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;
};

複製代碼
相關文章
相關標籤/搜索