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