LeetCode 446. Arithmetic Slices II - Subsequence

原创 2016年11月17日 10:13:14

欢迎移步到我的个人博客

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

题目要求

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.

For example, these are arithmetic sequences:

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.

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.

Example:

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]
Subscribe to see which companies asked this question

题意解析

这道题的含义就是找出数列中所有3个数以上的等差数列的数量。

解法分析

使用动态规划来解这道题。假设dp[i][j]表示以A[i]结尾的子序列(P0, P1, …, Pi)构成的数列,序列中的元素之差为j。而dp[i][j]=dp[k][j]>0?dp[k][j]+1:1,0<=i

解题代码

    public int numberOfArithmeticSlices(int[] A) {
        int re = 0;
        HashMap<Integer, HashMap<Long, Integer>> diffMaps = new HashMap<>();
        for (int i = 0; i < A.length; i++) {
            HashMap<Long, Integer> diffMap = new HashMap<>();
            diffMaps.put(i, diffMap);
            int num = A[i];
            for (int j = 0; j < i; j++) {
                if ((long) num - A[j] > Integer.MAX_VALUE)
                    continue;
                if ((long) num - A[j] < Integer.MIN_VALUE)
                    continue;
                long diff = (long) num - A[j];
                int count = diffMaps.get(j).getOrDefault(diff, 0);
                diffMaps.get(i).put(diff, diffMaps.get(i).getOrDefault(diff, 0) + count + 1);
                re += count;
            }
        }
        return re;
    }

相关文章推荐

LeetCode 446. Arithmetic Slices II - Subsequence

一道长得一副dp的样子的dp题。这道题难度不算特别大,因为看得出来肯定是dp题。因为,一个等差序列里面有好几个小的等差序列。 例如,2 4是一个等差序列,2 4 6是一个等差序列。 所以我们发现等...

Leetcode-446. Arithmetic Slices II - Subsequence

题目: A sequence of numbers is called arithmetic if it consists of at least three elements and if th...

LeetCode 446. Arithmetic Slices II - Subsequence

Problem Statement(Source) A sequence of numbers is called arithmetic if it consists of at least thre...

[LeetCode]446. Arithmetic Slices II - Subsequence

https://leetcode.com/problems/arithmetic-slices-ii-subsequence/#/description 找到乱序数组中所有gap相同的子序列个数...
  • gqk289
  • gqk289
  • 2017年03月15日 11:46
  • 119

446. Arithmetic Slices II - Subsequence

原题网址:https://leetcode.com/problems/arithmetic-slices-ii-subsequence/ A sequence of numbers is c...
  • jmspan
  • jmspan
  • 2016年12月04日 04:18
  • 738

LeetCode 413.Arithmetic Slices 解题报告

LeetCode 413. Arithmetic Slices 解题报告

413. Arithmetic Slices

A sequence of number is called arithmetic if it consists of at least three elements and if the diffe...

动态规划——446. Arithmetic Slices II - Subsequence[HARD]

终于又做了一道 HARD,新学了hash_map…… 题目描述 A sequence of numbers is called arithmetic if it consists of at le...
  • xiegr
  • xiegr
  • 2017年05月13日 21:58
  • 66

【算法作业14】LeetCode 413. Arithmetic Slices

第十四周算法作业:LeetCode 413. Arithmetic Slices

Leetcode 413. Arithmetic Slices

这题还是在锻炼使用dp的能力呢~,不过比前一篇博客的题目感觉上稍微简单一点~ -题目- A sequence of number is called arithmetic if it consis...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 446. Arithmetic Slices II - Subsequence
举报原因:
原因补充:

(最多只允许输入30个字)