1. 程式人生 > >(Java) LeetCode 413. Arithmetic Slices —— 等差數列劃分

(Java) LeetCode 413. Arithmetic Slices —— 等差數列劃分

cal 增加 劃分 之前 += UNC nsis for part

A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.

For example, these are arithmetic sequence:

1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9

The following sequence is not arithmetic.

1, 1, 2, 5, 7

A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.

A slice (P, Q) of array A is called arithmetic if the sequence:
A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.

The function should return the number of arithmetic slices in the array A.

Example:

A = [1, 2, 3, 4]
return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.

想了半天這道題竟然是一道找規律問題…有的時候真的難以捉摸什麽問題需要推導,什麽問題是找規律。

如果數組是{1,2,3},結果是1;

如果數組是{1,2,3,4},結果是3;

如果數組是{1,2,3,4,5},結果是6;

如果是數組是{1,2,3,4,5,6},結果是10……

也就是說如果新掃描到的元素仍能和之前的元素保持等差數列關系,那麽新形成的子等差數列個數按照1,2,3,4……的規律增加。其實找到規律這道題就做出來了。所以本題根本是尋找差子數列的終點,並以此時的結果增量更新最終結果。不滿足等差數列的時候增量就要重置為1。見下文代碼。


Java

class Solution {
    
public int numberOfArithmeticSlices(int[] A) { if (A == null || A.length <= 2) return 0; int cur = 1, res = 0, diff = A[1] - A[0]; for (int i = 2; i < A.length; i++) { if (A[i] - A[i-1] == diff) res += cur++; else { diff = A[i] - A[i-1]; cur = 1; } } return res; } }

(Java) LeetCode 413. Arithmetic Slices —— 等差數列劃分