Leecode 1218. 最长定差子序列——Leecode每日一题系列
生活随笔
收集整理的這篇文章主要介紹了
Leecode 1218. 最长定差子序列——Leecode每日一题系列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天是堅持每日一題打卡的第十天
題目鏈接:https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-difference/
題解匯總:https://zhanglong.blog.csdn.net/article/details/121071779
題目描述
給你一個整數數組 arr 和一個整數 difference,請你找出并返回 arr 中最長等差子序列的長度,該子序列中相鄰元素之間的差等于 difference 。
子序列 是指在不改變其余元素順序的情況下,通過刪除一些元素或不刪除任何元素而從 arr 派生出來的序列。
示例 1:
輸入:arr = [1,2,3,4], difference = 1
輸出:4
解釋:最長的等差子序列是 [1,2,3,4]。
示例 2:
輸入:arr = [1,3,5,7], difference = 1
輸出:1
解釋:最長的等差子序列是任意單個元素。
示例 3:
輸入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
輸出:4
解釋:最長的等差子序列是 [7,5,3,1]。
提示:
1 <= arr.length <= 105
-104 <= arr[i], difference <= 104
思路:簡單DP,狀態轉移方程為:dp[i]=dp[i?difference]+1dp[i] = dp[i - difference] + 1dp[i]=dp[i?difference]+1
用unordered_map做存儲,這樣不用考慮i為負的情況。
class Solution { public:int longestSubsequence(vector<int>& arr, int difference) {unordered_map<int, int>dp;int MAX = -1;for (auto i : arr) {dp[i] = dp[i - difference] + 1;MAX = max(MAX, dp[i]);}return MAX;} };
???——鍛煉發現事物統一性和功能性的能力,這樣會使代碼簡潔、干凈并且功能強大。
總結
以上是生活随笔為你收集整理的Leecode 1218. 最长定差子序列——Leecode每日一题系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【最常用】两种java中的占位符的使用
- 下一篇: Leecode 268. 丢失的数字——