首页 > 其他分享 >1027. 最长等差数列

1027. 最长等差数列

时间:2023-04-22 17:00:35浏览次数:32  
标签:1027 tem nums int max dp 最长 等差数列

给你一个整数数组 nums,返回 nums 中最长等差子序列的长度。

回想一下,nums 的子序列是一个列表 nums[i1], nums[i2], ..., nums[ik] ,且 0 <= i1 < i2 < ... < ik <= nums.length - 1。并且如果 seq[i+1] - seq[i]( 0 <= i < seq.length - 1) 的值都相同,那么序列 seq 是等差的。

 

示例 1:

输入:nums = [3,6,9,12]
输出:4
解释:
整个数组是公差为 3 的等差数列。
示例 2:

输入:nums = [9,4,7,2,10]
输出:3
解释:
最长的等差子序列是 [4,7,10]。
示例 3:

输入:nums = [20,1,15,3,10,5,8]
输出:4
解释:
最长的等差子序列是 [20,15,10,5]。
 

提示:

2 <= nums.length <= 1000
0 <= nums[i] <= 500

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-arithmetic-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

大致思路是:

遍历元素,记录该元素作为等差数列最后一个数字时,等差数列的长度。

之后再遇到可以加到这条等差数列末尾的数字时长度在前一个的基础上加一。

由于数据量不大,用数组可以代替哈希表。

数组写法:

class Solution {
    public int longestArithSeqLength(int[] nums) {
        int max = 0;
        // 数据量不大。
        int[][] dp = new int[nums.length][1001];
        for (int i = 0; i < nums.length; i ++) {
            for (int j = 0; j < i; j ++) {
                int tem = nums[i] - nums[j] + 500;
                dp[i][tem] = dp[j][tem] + 1;
                max = Math.max(max, dp[i][tem]);
            }
        }
        // 由于是从 0 开始计算长度,最后的长度应该比记录的长度大 1。
        return max + 1;
    }
}

 

标签:1027,tem,nums,int,max,dp,最长,等差数列
From: https://www.cnblogs.com/allWu/p/17343420.html

相关文章

  • 【DP】LeetCode 1143. 最长公共子序列
    题目链接1143.最长公共子序列思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素......
  • 力扣——5.最长回文子串(c语言)
    题目描述:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。示例1:输入:"babad"输出:"bab"注意:"aba"也是一个有效答案。示例2:输入:"cbbd"输出:"bb"1、思路1:动态规划对于一个子串而言,如果它是回文子串,并且长度大于2,那么将它首尾两个字......
  • 【DP】LeetCode 718. 最长重复子数组
    题目链接718.最长重复子数组思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以第i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(......
  • #yyds干货盘点# LeetCode程序员面试金典:最长有效括号
    题目:给你一个只包含'(' 和')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例1:输入:s="(()"输出:2解释:最长有效括号子串是"()"示例2:输入:s=")()())"输出:4解释:最长有效括号子串是"()()"示例3:输入:s=""输出:0代码实现:classSolution{publicint......
  • day52 300.最长递增子序列 | 674. 最长连续递增序列 | 718. 最长重复子数组
    给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是[2,3,7,101......
  • 最长上升子序列
    #include<bits/stdc++.h>usingnamespacestd;/*测试用例:8-710923881*/constintN=1e5+10;intn,a[N];intf[N],idx;//dp数组,idx:下标指针,因为从1开始,也可以理解为个数、LIS的最大长度intpos[N];//p数组,记录原始数组每个数字在dp数组中......
  • B. Tree Tag(贪心+树的最长直径)
    题目B.TreeTag题意思路因为这是一颗树,所以不管怎么追逐,我们都可以理解为在同一条路上追逐(去掉我们不走的路,就是一个线段)首先,如果da>db,显然能追上,进一步,da==db时,因为路径的长度是有限的,也显然可以追上因为树上任意两点的最短路径是固定的,所以a点可以一直朝着b追,而b是......
  • 最长公共子串
    最长公共子串给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。输入格式共两行,每行一个由小写字母和数字构成的字符串。输出格式一个整数,表示给定两个字符串的不包含数字的最长公共子串的长度。如果不存在满足要求的非空公共子串,则输出$0$。数据范围输入......
  • LOJ #6564 - 最长公共子序列(bitset 求 LCS)
    怎么全天下就我没见过?被薄纱了/ll还是考虑从朴素的DP入手优化。不难发现对于固定的\(i\),相邻的\(dp_{i,j}\)的差要么是\(0\)要么是\(1\),也就是说从压位的考虑角度可能很有前途。因此我们转而维护\(dp_{i,j}\)的差分数组\(v_{i,j}=dp_{i,j}-dp_{i,j-1}\)。考虑新添加一......
  • 409. 最长回文串
    问题描述给定一个字符串s,返回由s中字母所构造的最长回文串的长度。问题分析符号设定Nch为ch在回文串中出现的次数回文串中最多有一个字符Nch为奇数算法classSolution:deflongestPalindrome(self,s:str)->int:count_ch={}forchins:......