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;
    	}
    }
    
  • 相关阅读:
    子树的结点个数
    CF988 D. Points and Powers of Two【hash/数学推理】
    回溯法练习【BFS/DFS】
    Zoj 1610 Count the Colors (线段树+区间更新+暴力计数)
    Poj 2947 widget factory (高斯消元解同模方程)
    Poj 2065 SETI (高斯消元)
    Lightoj 1054
    Poj 2528 Mayor's posters (线段树+离散化)
    Lightoj 1090
    Poj 1753 Flip Game 高斯消元
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11072293.html
Copyright © 2011-2022 走看看