2020--08--23 数组里的最大连续数

longest-consecutive-sequence

http://www.nowcoder.com/questionTerminal/57d83a2501164168841c158a7535b458

给定一个无序的整数类型数组,求最长的连续元素序列的长度。
例如:
给出的数组为[100, 4, 200, 1, 3, 2],
最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4
你需要给出时间复杂度在O(n)之内的算法

这道题我想到的有两种做法:
1、用一个辅助数组,记录下来数组每个位置对应的连续数字长度,最后取最大值(后面可以省取数组,但这样做的通过率95%)
图片说明

import java.util.*;


public class Solution {
    public boolean contain(int[] num,int value ){//contain用来查看value是不是再num[]里面
        for (int i = 0; i < num.length; i++) {
            if (value==num[i])return true;
        }
        return false;
    }
    //这道题的思路是用maxLength来跟进每一个索引值对应的连续长度,max随时跟进找到maxLength的最大值就是我们的答案
    public int longestConsecutive (int[] num) {
        int maxLength=1;//maxLength用来跟进
        int max = 0;//max是跟进我们的答案
        for (int i = 0; i < num.length; i++) {
            int index=1;//index是用来控制数组索引位置num[i]+index++的连续个数,如果num[i]+1存在了就往后找num[i]+2...
            while(true){
                if (contain(num,num[i]+index++)){//死循环,如果数组里有num[i]+index,那么maxLength加1
                    maxLength++;
                }else{//否则与max比较进行替换
                    if ( maxLength > max) {
                        max =maxLength;
                    }
                    maxLength=1;//maxLength归1
                    break ;
                }
            }
        }
        System.out.println(max);
        return max;
    }
}

2、用Arrays.sort排序,接下来找最长连续长度

import java.util.*;

public class Solution {
    public int longestConsecutive (int[] num) {
        Arrays.sort(num);//1、排序
        int maxLength=1;
        int max=1;
        for (int i = 0; i < num.length-1; i++) {//2、遍历
            if (num[i]==num[i+1]){//如果第i项=第i+1项,继续循环
                continue;
            }else if (num[i]==num[i+1]-1){//递增1,maxLength++
                maxLength++;
                 if (max<maxLength){
                    max = maxLength;
                }
            }else{//否则 maxLength归1,继续遍历
                maxLength=1;
            }
        }
        return max;
    }
}

第二钟相对比较简单,通过率也100,第一种的话手撕底层源码,时间复杂度也比较高

全部评论
第一种是O(nm),第二种是O(nlogn)的算法,都不是O(n)
1 回复 分享
发布于 2020-09-01 09:06
为什么第二种方法line9:if (num[i]==num[i+1])不会数组越界呢?当i=num.length-1时,num[i+1]不是会越界吗?
点赞 回复 分享
发布于 2020-08-27 21:30

相关推荐

门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务