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;
    	}
    }
    
  • 相关阅读:
    xagrs 指定参数位置
    Virtual Machine Kernel Panic : Not Syncing : VFS : Unable To Mount Root FS On Unknown-Block (0,0)
    Laravel Session() 失效的问题
    dirname
    github、git、idea
    ubuntu环境变量在/etc/environment
    ubuntu的PPA
    VMware 增加硬盘ubuntu
    比特币概念
    cpu查询
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11072293.html
Copyright © 2011-2022 走看看