华为机试测试- 求有序数组中最长的等差序列

原题目是求一个无序数组中最长的等差数列。
求随机数构成的数组中找到长度大于=3 的最长的等差数列, 输出等差数列由小到大:
如果没有符合条件的就输出
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
 
 
思路:
1、排序
2、d的取值范围是[0,max-min],共有max-min+1种情况
3、对每一种情况进行查找
4、对于公差d,要求最长的等差序列,需要两个循环,一个外循环从头到尾遍历,内循环从外循环的起始遍历点开始利用公式 arr[i]=arr[start]+len*d,假如符合就长度加1假如大于就跳出循环。
 
    public static void getProgressArray(int[] array ,int d)
    {
        int size=array.length;
        int maxLenStart=0;//最大数组的开始位置
        int maxLen=0;//最大长度
        int startIndex=0;//起始位置
        for(;startIndex<size-maxLen;startIndex++)
        {
            int pLen=1;
            for(int i=startIndex+1;i<size;i++)
            {
                if(array[i]==(array[startIndex]+d*pLen))
                {
                    pLen++;
                    if(pLen>maxLen)
                    {
                        maxLenStart=startIndex;
                        maxLen=pLen;
                    }
                }
                else if(array[i]>(array[startIndex]+d*pLen))
                {
                    break;
                }
            }
        }
        int [] arr=new int[maxLen];
        for(int i=0;i<maxLen;i++)
        {
            arr[i]=array[maxLenStart]+i*d;
        }
        System.out.println(Arrays.toString(arr));
    }

 

转载于:https://www.cnblogs.com/maydow/p/4832617.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值