[Swift]LeetCode446. 等差数列划分 II - 子序列 | Arithmetic Slices II - Subsequence

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-bokjllgr-gh.html 
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

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

For example, these are arithmetic sequences:github

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 subsequence slice of that array is any sequence of integers (P0, P1, ..., Pk) such that 0 ≤ P0 < P1 < ... < Pk < N.微信

A subsequence slice (P0, P1, ..., Pk) of array A is called arithmetic if the sequence A[P0], A[P1], ..., A[Pk-1], A[Pk] is arithmetic. In particular, this means that k ≥ 2.less

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

The input contains N integers. Every integer is in the range of -231 and 231-1 and 0 ≤ N ≤ 1000. The output is guaranteed to be less than 231-1.this

Example:spa

Input: [2, 4, 6, 8, 10]

Output: 7

Explanation:
All arithmetic subsequence slices are:
[2,4,6]
[4,6,8]
[6,8,10]
[2,4,6,8]
[4,6,8,10]
[2,4,6,8,10]
[2,6,10]

若是一个数列至少有三个元素,而且任意两个相邻元素之差相同,则称该数列为等差数列。code

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

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

如下数列不是等差数列。

1, 1, 2, 5, 7 

数组 A 包含 N 个数,且索引从 0 开始。该数组子序列将划分为整数序列 (P0, P1, ..., Pk),P 与 Q 是整数且知足 0 ≤ P0 < P1 < ... < Pk < N。 

若是序列 A[P0],A[P1],...,A[Pk-1],A[Pk] 是等差的,那么数组 A 的子序列 (P0,P1,…,PK) 称为等差序列。值得注意的是,这意味着 k ≥ 2。

函数要返回数组 A 中全部等差子序列的个数。

输入包含 N 个整数。每一个整数都在 -231 和 231-1 之间,另外 0 ≤ N ≤ 1000。保证输出小于 231-1。 

示例: 

输入:[2, 4, 6, 8, 10]

输出:7

解释:
全部的等差子序列为:
[2,4,6]
[4,6,8]
[6,8,10]
[2,4,6,8]
[4,6,8,10]
[2,4,6,8,10]
[2,6,10]

1128ms
 1 class Solution {
 2     func numberOfArithmeticSlices(_ A: [Int]) -> Int {
 3         var res:Int = 0
 4         var n:Int = A.count
 5         var dp:[[Int:Int]] = [[Int:Int]](repeating:[Int:Int](),count:n)
 6         for i in 0..<n
 7         {
 8             for j in 0..<i
 9             {
10                 var delta:Int64 = Int64(A[i]) - Int64(A[j])
11                 if delta > Int64(Int.max) || delta < Int64(Int.min) {continue}
12                 var diff:Int = Int(delta)
13                 
14                 if dp[i][diff] == nil
15                 {
16                     dp[i][diff] = 1
17                 }
18                 else
19                 {
20                     dp[i][diff]! += 1                    
21                 }
22                 
23                 if dp[j][diff] != nil
24                 {
25                     res += dp[j][diff]!
26                     dp[i][diff]! += dp[j][diff]!
27                 }
28             }
29         }
30         return res
31     }
32 }
相关文章
相关标签/搜索