leetcode 446. Arithmetic Slices II - Subsequence | 446. 等差数列划分 II - 子序列(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 446. Arithmetic Slices II - Subsequence | 446. 等差数列划分 II - 子序列(动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
https://leetcode.com/problems/arithmetic-slices-ii-subsequence/
題解
找等差子數列,詳見注釋。
一個月前做過,沒通過,今天 daily challenge 又看了下,只是 int 的越界問題,轉成 long 就好了。
class Solution {public int numberOfArithmeticSlices(int[] A) {int n = A.length;long ans = 0;Map<Long, Long>[] cnt = new Map[n]; // [i]<dif,cnt>表示以i為結尾,公差為dif的數列個數for (int i = 0; i < n; i++) { // a[n]cnt[i] = new HashMap<>(i);for (int j = 0; j < i; j++) { // a[n-1]long dif = (long) A[i] - A[j];long sum = cnt[j].getOrDefault(dif, (long) 0); // 以a[n]結尾,dif為公差的情況下,找以a[n-1]結尾的等差數列個數long origin = cnt[i].getOrDefault(dif, (long) 0); // 拿到map中原來的數,避免put覆蓋。主要針對a[n]==a[n-1]的情況,即公差為0的常數列。cnt[i].put(dif, origin + sum + 1);ans += sum; // 只有找到以a[n-1]結尾的等差數列個數才有資格加入到sum中,因為等差數列至少要3個元素}}return (int) ans;} }總結
以上是生活随笔為你收集整理的leetcode 446. Arithmetic Slices II - Subsequence | 446. 等差数列划分 II - 子序列(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 764. Larges
- 下一篇: leetcode 224. Basic