求最长等差数列长度

求一组数中最长的等差数列的长度 题目描述题目:给定一个数组求出数组最长等差数列的长度。 举例:3,8,4,5,6,2 输出:5。 思路典型的动态规划问题,但是注意此题的动态规划不能简单用一个dp数组就可以得出长度,应该在用一个表示最长长度的变量来随时更新为每一次遍历的最长长度。 思想为:dp[i][diff]表示第i个数,等差为diff的长度。 dp[i][diff] = dp[j][diff] + 1,j < i代码 阅读详情

Longest Consecutive Sequence

https://leetcode.com/problems/longest-consecutive-sequence/

LeetCode上面这道题是求最长连续子序列。换种说法就是求公差为1的最长等差数列。

题目描述

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

分析:

需要注意的是时间复杂度要求是O(n),所以排序后再处理那种方法是不可行的。我们可以就用数组中的元素作为key建立hash表,然后直接循环遍历找当前元素val的,val-1,val+1。

代码:
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int n=nums.size();
        if(n==0 || n==1){
            return n;
        }
        int longest=1,val,cur;
        unordered_map<int,int> m;
        for(int i=0;i<n;i++){
            m[nums[i]]=0;//没有被访问过的标记为0
        }
        for(int i=0;i<n;i++){
            if(m[nums[i]]){
                continue;
            }
            cur=1;
            val=nums[i]-1;
            while(m.find(val)!=m.end() && !m[val]){
                m[val]=1;
                val--;
                cur++;
            }
            val=nums[i]+1;
            while(m.find(val)!=m.end() && !m[val]){
                m[val]=1;
                val++;
                cur++;
            }
            longest=max(longest,cur);
        }
        return longest;
    } 
};

题目:

给一个无序数组,求这个数组中元素所能形成的最长等差数列的长度。

分析:

这里的公差d就未知了。两种dp方法。

第一种:
dp[i][d]表示数组0~i范围内,公差为d的等差数列长度。
dp[i][d]=dp[j][d]+1。
其实跟插入排序法有点像,范围由小往大扩展,当范围i定了之后,再倒着从j=i-1到j=0,我们对(i,j)形成的每个公差d=nums[i]-nums[j]所构成的dp[i][d]进行处理。

第二种:
dp[i][j]表示以nums[i]作为首项,nums[j]作为第二项的等差数列长度。
所以,我们需要从后往前进行处理。
由等差数列的性质我们可知,如果nums[i],nums[j],nums[k]构成等差数列,则满足nums[i]+nums[k]=2nums[j]。
初始化工作对于dp[0..n-2][n-1]=2。
j从n-2开始,从后往前找满足条件nums[i]+nums[k]=2nums[j]的元素,如果满足则dp[i][j]=dp[j][k]+1。

代码:

第一种:

int LongestArithmeticSequence(vector<int> nums){
    int n = nums.size();
    sort(nums.begin(),nums.end());
    int len = nums[n - 1] - nums[0];
    vector<vector<int>> dp(n,vector<int>(len+1,1));//dp[i][d]表示0~i范围内,公差为d的等差数列长度
    int d,longest=1;//公差
    for (int i = 1; i < n; i++){
        for (int j = i - 1; j >= 0; j--){
            d = nums[i] - nums[j];
            dp[i][d] = dp[j][d]+1;
            longest = max(longest,dp[i][d]);
        }
    }
    return longest;
}

第二种:

int LongestArithmeticSequence(vector<int> nums){
    int n = nums.size();
    sort(nums.begin(),nums.end());
    vector<vector<int>> dp(n, vector<int>(n));
    {
        for (int i = 0; i < n - 1; i++){
            dp[i][n - 1] = 2;
        }
    }
    int i, k,longest=1;
    for (int j = n - 2; j >= 0; j--){
        i = j - 1;
        k = j + 1;
        while (i >= 0 && k < n){
            if (nums[i] + nums[k] == 2 * nums[j]){
                dp[i][j] = dp[j][k] + 1;
                longest = max(longest,dp[i][j]);
                i--;
                k++;
            }
            else if (nums[i] + nums[k]>2 * nums[j]){
                i--;
            }
            else{
                k++;
            }
        }
    }
    return longest;
}
LED灯闪烁实验:代码集成 LED灯闪烁实验已经全部完成,在该实验中使用了较多的工具链,涉及底层软件、建模、软件编译等。首先,通过STM32CubeMX工具进行STM32底层软件配置,可以大大减少手写代码的工作量。另外由于做了可视化,也降低了STM32的上手难度,提升效率。利用Simulink建模,可以在PC环境下验证应用层算法的正确性而不依赖于具体控制器,实现应用层算法和底层软件、控制器硬件的解耦。另外,图形化的建模方式也更加有利于开发者思考与分析,大量的封装库文件也可以降低开发的工作量。 阅读详情

相关推荐

Xilinx HydraMini试玩教程

HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程。

qq_25762163的博客 1772

找最长等差数列的长度

找最长等差数列的长度

成功=坚持+努力+目标 2608

中移物联ML307C模组OPENCPU笔记2

本文介绍了如何编译和运行一个DEMO程序,以官方SDK为例。

weixin_43700831的博客 1883

求数列中连续数值组成的等差数列最大长度_最长等差数列

本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法。编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习)。给定一组数字,在其中找到最长等差数列的长度。我们看两个例子:例1)输入:set [] = {1,7,10,15,27,29}输出 = 3最长的等差数列为{1,15,29},3个数字之间依次之间的等差值为14...

weixin_39974030的博客 1095

数据包络分析(超效率-SBM模型)附python代码

超效率-SBM模型超效率SBMpython代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了。 上阵子挺多人私信我,原谅我记性不好,可能没有回复全。 这篇文章是超效率的扩展。 超效率SBM SBM本身就是非径向模型(non-radial model),想要了解径向超效率的请自行去前面翻阅。 上篇文章说到super-SBM的一个模型,公式为: 这个模型是分式模型,我们可以通过charnes cooper变换,将其转变成为: python代码(部分) 在编程过程中,本来我以为第一个模型是无

weixin_43217288的博客 3万+

Globus数据下载全攻略:从零配置到批量下载大文件(附常见问题解决)

本文详细介绍了Globus数据下载的全流程,从零配置到批量下载大文件的实用技巧,包括环境准备、高级传输策略、性能优化及常见问题解决方案。Globus作为科研数据的高效传输工具,通过并行流传输和自动校验技术,显著提升大规模数据传输的效率和可靠性。

u9v0w的博客 662

求数列中连续数值组成的等差数列最大长度_高二数学期中考试考点汇总之数列第一讲...

等差数列和等比数列考点汇总,教你轻松学数列hello,大家好,这里是摆渡学涯,很高兴又在这里跟大家交流学习技巧了。这次课程咱们来为大家讲一下等差数列和等比数列相关的考点,教你轻松拿下数列。基本概念1 什么是数列数列是一列有规则的数排下来组成的数组。如1,3,5,7……,就是数列。数列中的项数是从第一项开始的,且项数的序列号都是整数。如该数列第一项为1,第二项为3,第三项为5,以此类推即可。注意:数...

weixin_39599654的博客 242

抖音短连接v.douyin.com/xxx 如何生成?

最近公司有个需求,在抖音里如何宣传自己的网站,并且不要有拦截域名的提示,截图如下。 通过ida反编译抖音的app后,将下载后的ipa文件用解压缩软件(如7zip等)解压,从解压后的目录Payload/Aweme.app/找到Aweme可执行文件,拖入ida进行反编译,ida可以检测objective-c语法。 然后进入主题,既然是聊天发消息,就尝试在ida里搜索"message",看看能否找到对...

kakuapi的博客 3万+

求随机数构成的数组中找到长度大于=3的最长的等差数列

参考:http://blog.youkuaiyun.com/zhanxinhang/article/details/6667868 题:求随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大:  如果没有符合条件的就输出[0,0] 格式: 输入[1,3,0,5,-1,6] 输出[-1,1,3,5]

xc889078的专栏 1134

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3675

ardupilot 获取避障传感器数据

本节主要记录自己学ardupilot的避障代码过程,首先看下怎么注册避障传感器,然后怎么获取避障数据。

陌城烟雨 5524

动态规划-数组中求最长等差数列的长度

题目:给定一个数组求出数组最长等差数列的长度。 举例:3,8,4,5,6,2 输出:5。 思路:利用区间dp来做,dp[i][diff]的意思是 intAr[0]到intAr[i],等差为diff的等差长度。在求dp长度的时候利用一个ans变量保存最大即可。 dp的求法: 有diff=intAr[i]-intAr[j](j<i) dp[i][diff]=dp[j][diff]。 细节处

lizhao007 4715

ROS2 Nav2 - 模型预测路径积分控制器(MPPI)

这是一个预测控制器(局部轨迹规划器),用于实现模型预测路径积分(MPPI)算法,以跟踪具有自适应避障功能的路径。它包含基于插件的 critic 函数,可影响算法的行为。它由 Aleksei Budyakov 创建,由 Steve Macenski 为 Nav2 进行改编和开发。该插件实现了 nav2_core::Controller(控制器)接口,可在整个导航堆栈中作为控制器服务器的动作服务器(controller_server)中的局部轨迹规划器使用。据测定,该控制器可在中等英特尔处理器(第四代 i5)上

机器人控制与仿真应用 3908

LeetCode:求最长的等差数列长度

Given an array A of integers,return the length of the longest arithmetic subsequence in A. Recall that a subsequence of A is a list A[i_1], A[i_2]....,A[i_k] with 0<=i_1<i_2...<i_k =A.length-1,and that a sequence B is arithmetic if B[i+1]-B[i] ar.

Jiangtagong的博客 589

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

求整数随机数构成的数组中找到长度大于=3的最长的等差数列

求整数随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大:  如果没有符合条件的就输出[0,0] 格式: 输入[1,3,0,5,-1,6] 输出[-1,1,3,5] 要求时间复杂度,空间复杂度尽量小 使用两个vector保存数据,先进行排序,需要O(nlogn)的时间,再进行查找。查找使用剪枝降低检索效率。最坏情况下需要O

moonboat0331的专栏 1130

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c语言求数列中连续数值组成的等差数列最大长度_最长等差子序列的长度

问题描述给定一个整数数组 A,返回A 中最长等差子序列的长度。输入:[20,1,15,3,10,5,8] 输出:4 解释:最长的等差子序列是 [20,15,10,5]题目来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-arithmetic-sequence问题分析我们要找出最长的等差子序列,则必须要找出所有的等差子序列,然后比较...

weixin_39606048的博客 546

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

算法: 求整数随机数构成的数组中找到长度>=3的最长的等差数列

求整数随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大: 如果没有符合条件的就输出[0,0] 格式: 输入[1,3,0,5,-1,6] 输出[-1,1,3,5] 要求时间复杂度,空间复杂度尽量小 ...

chimixie6841的博客 219

[zz]求随机数构成的数组中找到长度大于或等于3的最长的等差数列

输出等差数列由小到大?如果没有符合条件的就输出“NO”。 例如:输入[1,3,0,5,-1,6] ,输出[-1,1,3,5] 。 要求:时间复杂度,空间复杂度尽量小 解体思路:设随机数为a[],首先排序, (1)枚举两个数,作为数列中相邻的两个元素Ai,Ai+1,那么可求出等差d=Ai+1-Ai。于是Ai-1=Ai-d,Ai+2=Ai+1+d,因此可以在剩下的数寻找Ai-1,Ai+2是否...

weixin_33921089的博客 70

94.微软笔试题 求随机数构成的数组中找到长度大于=3 的最长的等差数列

94.微软笔试题 求随机数构成的数组中找到长度大于=3 的最长的等差数列, 输出等差数列由小到大: 如果没有符合条件的就输出 格式: 输入[1,3,0,5,-1,6] 输出[-1,1,3,5] 要求时间复杂度,空间复杂度尽量小   void main() {  int a[]={1 ,3 ,0 ,5, -1, 6};  int i ,j ,k,len,  m,n,tmp,t;  len

dahai_881222的专栏 1132

求随机数构成的数组中找到长度大于或等于3的最长的等差数列

转自:http://www.cnblogs.com/eric-blog/archive/2012/05/04/2483402.html 输出等差数列由小到大?如果没有符合条件的就输出“NO”。 例如: 输入[1,3,0,5,-1,6] ,输出[-1,1,3,5] 。 要求:时间复杂度,空间复杂度尽量小 解体思路:设随机数为a[],首先排序, (1)枚举两个

martin_liang的专栏 1100

微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列

求微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列 输出等差数列由小到大:  如果没有符合条件的就输出[0,0] 格式: 输入[1,3,0,5,-1,6] 输出[-1,1,3,5] 要求时间复杂度,空间复杂度尽量小 这里我还没有想到更好的办法,目前只实现了一个sb版本的时间复杂度为O(n^3)的算法。。暴力破解。。 #include #include

keep_moving_cqu的专栏 1635

c语言求数列中连续数值组成的等差数列最大长度_leetcode 1027. 最长等差数列 动态规划解法...

解题方法本题我用两种方法尝试过:暴力法(TLE超时了不推荐,O(n^3)的复杂度)动态规划法空间复杂度O(N^2)(申请了一个长度为为N的list对应每个数字;每个list元素装着一个O(N)的字典,用于存储以当前数字作为等差子序列结尾时,等差间隔key和这一等差间隔对应的序列长度value)时间复杂度O(N^2) (第一层循环以每个数字i作为结尾,第二层循环遍历原序列的开始->第一层循环的...

weixin_39762464的博客 431
上一篇: CPU调度(进程调度)策略
下一篇: 3.8求二叉树中节点的最大距离
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值