• 1027. 最长等差数列


    1. 背

    有些题真是就算知道了怎么做,也贼难处理。
    这道题一看就知道怎么办。dp[i][j]表示必须以i结尾时,公差为j时的最长等差数列。所以只要把这个矩阵的结果返回就时答案了。
    先for一遍nums,再for一遍0到i-1,把它前面所有的数据都查一遍,当前结果等于之前的结果+1。
    basecase就是将所有的数据赋初值1,因为所有的数据最短都是字符串自己,即1。
    最大的问题就是dp数组的列数。因为公差这种东西可以是负数的,所以这个列数就应该是两倍的最大值。而所有的公差结果都应该加上all_deta。这种东西算一下就知道,在所有的结果都+all_delta就行了。
    看说明这么简单,做了好几个小时。

    2. 题目

    给你一个整数数组 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]。

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

    3. 答案

    class Solution {
    public:
    int longestArithSeqLength(const vector& nums) {
    	int all_delta = *max_element(nums.begin(),nums.end())-*min_element(nums.begin(),nums.end());
    	int col = 2*(*max_element(nums.begin(),nums.end()))+1;
    	int row = static_cast(nums.size());
    
    	vector>dp(row,vector(col,1));
    	for(int i=1;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    使用 ahooks 中的 useRequest 轻松管理React中的网络请求
    华为机试真题 Python 实现【过滤组合字符串】【2022.11 Q4新题】
    实时检测网络钓鱼攻击的5种方法
    踹掉后端,前端导出Excel!
    Spring与MongoDB的结合(MongoTemplate)
    互联网应用开发实践:MySQL数据库部署与操作(Docker、SpringBoot)
    Gateway之限流、熔断,Sentinel--服务容错
    硅谷15菜单权限
    【HCIP】RSTP
    USB 协议 (四) USB HOST 侧 的概念详解
  • 原文地址:https://blog.csdn.net/qigezuishuaide/article/details/127940254