All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0401_0500.s0446_arithmetic_slices_ii_subsequence.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0401_0500.s0446_arithmetic_slices_ii_subsequence;

// #Hard #Array #Dynamic_Programming #2022_07_16_Time_68_ms_(99.15%)_Space_76.2_MB_(89.36%)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 446 - Arithmetic Slices II - Subsequence\.
 *
 * Hard
 *
 * Given an integer array `nums`, return _the number of all the **arithmetic subsequences** of_ `nums`.
 *
 * 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, `[1, 3, 5, 7, 9]`, `[7, 7, 7, 7]`, and `[3, -1, -5, -9]` are arithmetic sequences.
 * *   For example, `[1, 1, 2, 5, 7]` is not an arithmetic sequence.
 *
 * A **subsequence** of an array is a sequence that can be formed by removing some elements (possibly none) of the array.
 *
 * *   For example, `[2,5,10]` is a subsequence of `[1,2,1, **2** ,4,1, **5** , **10** ]`.
 *
 * The test cases are generated so that the answer fits in **32-bit** integer.
 *
 * **Example 1:**
 *
 * **Input:** nums = [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] 
 *
 * **Example 2:**
 *
 * **Input:** nums = [7,7,7,7,7]
 *
 * **Output:** 16
 *
 * **Explanation:** Any subsequence of this array is arithmetic. 
 *
 * **Constraints:**
 *
 * *   `1 <= nums.length <= 1000`
 * *   -231 <= nums[i] <= 231 - 1
**/
public class Solution {
    public int numberOfArithmeticSlices(int[] arr) {
        Map> indexes = new HashMap<>();
        int[][] length = new int[arr.length][arr.length];
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                List ix = indexes.get(arr[i] - (arr[j] - (long) arr[i]));
                if (ix == null) {
                    continue;
                }
                for (int k : ix) {
                    length[i][j] += length[k][i] + 1;
                }
                count += length[i][j];
            }
            indexes.computeIfAbsent((long) arr[i], k -> new ArrayList<>()).add(i);
        }
        return count;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy