zoukankan      html  css  js  c++  java
  • [程序员代码面试指南]递归和动态规划-数组中的最长连续序列

    题目

    给定无需数组arr,返回器中最长的连续序列的长度。
    举例子:arr=[100,4,200,1,3,2],最长连续序列为[1,2,3,4],返回4.

    题解

    法一:排序,再遍历找。时间复杂度O(nlogn),空间复杂度O(n)
    法二:

    • 用map,key代表遍历过的某个数,value代表key这个数所在的最长连续序列的长度。
    • 遍历arr,只处理没出现过的。
    • 遍历key,map加(key,1),再找key+1,key-1,表示连续段的连接。然后只更新的连续序列的头和尾的key的value值,因为连续序列中间的元素左右两边的元素都已经加入到过map过了不会再处理。
    • 时间复杂度O(n),空间复杂度O(n).

    代码(法二)

    import java.util.HashMap;
    
    public class Main {
    	public static void main(String args[]) {
    		int[] arr= {100,4,200,1,3,2};
    		System.out.println(longestContinueSeqLen(arr));
    	}
    	
    	public static int longestContinueSeqLen(int[] arr){
    		if(arr==null||arr.length==0) {
    			return 0;
    		}
    		HashMap<Integer,Integer> map=new HashMap<>();
    		int maxLen=Integer.MIN_VALUE;
    		for(int num:arr) {
    			if(!map.containsKey(num)) {
    				map.put(num, 1);
    				int endKey=num;
    				if(map.containsKey(num+1)) {
    					int len=map.get(num+1);
    					endKey=num+len;
    					int newLen=len+1;
    					map.put(endKey, newLen);
    					map.put(num, newLen);
    					maxLen=maxLen>newLen?maxLen:newLen;
    				}
    				if(map.containsKey(num-1)) {
    					int len=map.get(num-1);
    					int begKey=num-len+1;
    					int newLen=len+map.get(num);
    					map.put(begKey, newLen);
    					map.put(endKey,newLen);
    					maxLen=maxLen>newLen?maxLen:newLen;
    				}
    			}
    		}
    		return maxLen;
    	}
    }
    
  • 相关阅读:
    Daily Scrum 10.24
    Daily Srum 10.22
    TFS的使用
    Daily Srum 10.21
    Scrum Meeting 报告
    团队博客作业Week4 --- 学霸网站--NABC
    团队博客作业Week3 --- 项目选择&&需求疑问
    团队博客作业Week2 --- 学长学姐访谈录
    团队博客作业Week1 --- 团队成员简介
    js将数组中一个或多个字段相同的子元素中合并
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11072293.html
Copyright © 2011-2022 走看看