等差數列劃分

2021-10-09 03:51:30 字數 1271 閱讀 2250

如果乙個數列至少有三個元素,並且任意兩個相鄰元素之差相同,則稱該數列為等差數列。

例如,以下數列為等差數列:

1, 3, 5, 7, 9

7, 7, 7, 7

3, -1, -5, -9

以下數列不是等差數列。

1, 1, 2, 5, 7

陣列 a 包含 n 個數,且索引從0開始。陣列 a 的乙個子陣列劃分為陣列 (p, q),p 與 q 是整數且滿足 0<=p如果滿足以下條件,則稱子陣列(p, q)為等差陣列:

元素 a[p], a[p + 1], ..., a[q - 1], a[q] 是等差的。並且 p + 1 < q 。

函式要返回陣列 a 中所有為等差陣列的子陣列個數。

示例:a = [1, 2, 3, 4]

返回: 3, a 中有三個子等差陣列: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。

解題思路:

首先遍歷原陣列 nums,用陣列 diffs 儲存相鄰兩個元素之間的差值。

然後遍歷 diffs,用陣列 cons 儲存其中連續相同的差值的數目,比如有 33 個 33 連在一起,意味著原陣列中這個位置存在乙個最大長度為 44 的等差數列。

然後遍歷 cons,對於長度為 n 的等差數列,其所有的長度大於等於 33 的子數列都是等差數列,則一共有 (n-2)(n-1)/2 個等差數列。

全部相加得到結果。

比如:nums = [1,2,3,4,5,6,12,14,16]

diffs = [1,1,1,1,1,6,2,2]

cons = [5,1,2]

# 將 1 捨去,nums 中有長度為 5+1 和 2+1 的等差數列

result = (6-2)(6-1)/2 + (3-2)(3-1)/2

可以用這個最原始的方法去解題,也可以用動態規劃,用乙個陣列去動態規劃,單個連續區間的遞增數量想加來表示多少個等差數列。

以下**,摘抄子力扣

和dp思路異曲同工,只不過dp思路是將這兩步過程合在一起了,對於連續的等差數列,diff一樣大,在dp思路中,1+dp[i]這一步其實形成的是乙個如1,2,3,。。這樣的遞增數列,求和之後就是(n-2)*(n-1)/2,所以總的來說dp思路更簡潔更巧妙些。這個思路更符合大家通常的思維方式

等差數列劃分

一.題目描述 如果乙個數列至少有三個元素,並且任意兩個相鄰元素之差相同,則稱該數列為等差數列。例如,以下數列為等差數列 1,3,5,7,9 7,7,7,7 3,1,5,9 以下數列不是等差數列。1,1,2,5,7 陣列 a 包含 n 個數,且索引從0開始。陣列 a 的乙個子陣列劃分為陣列 p,q p...

等差數列劃分

如果乙個數列至少有三個元素,並且任意兩個相鄰元素之差相同,則稱該數列為等差數列。例如,以下數列為等差數列 1,3,5,7,9 7,7,7,7 3,1,5,9 以下數列不是等差數列。1,1,2,5,7 陣列 a 包含 n 個數,且索引從0開始。陣列 a 的乙個子陣列劃分為陣列 p,q p 與 q 是整...

LeetCode 等差數列劃分

如果乙個數列至少有三個元素,並且任意兩個相鄰元素之差相同,則稱該數列為等差數列。陣列 a 包含 n 個數,且索引從0開始。陣列 a 的乙個子陣列劃分為陣列 p,q p 與 q 是整數且滿足 0 p函式要返回陣列 a 中所有為等差陣列的子陣列個數。示例 a 1,2,3,4 返回 3,a 中有三個子等差...