zoukankan      html  css  js  c++  java
  • 刷题128. Longest Consecutive Sequence

    一、题目说明

    题目128. Longest Consecutive Sequence,给定一列无序的整数,计算最大连续的整数的个数。复杂度要求是O(n),难度是Hard!

    二、我的解答

    这个题目解答方法包括,brute force、sort、hash。但brute force和sort的复杂度不符合要求,此处用hash。

    我总共写了2个版本,第1个版本 Time Limit Exceeded,代码如下:

    class Solution{
    	public:
    		int longestConsecutive(vector<int>& nums){
    			if(nums.size()<1) return 0;
    			if(nums.size()==1) return 1;
    			unordered_map<int,int> dp;
    			for(int i=0;i<nums.size();i++){
    				dp[nums[i]] = 1;
    			}
    			int max = 1;
    
    			for (unordered_map<int, int>::iterator x = dp.begin(); x!= dp.end(); x++){
    				int n = x->first -1;
    				while(dp.count(n)>0){
    					dp[n]++;
    					if(max<dp[n]) max = dp[n];
    					n--;
    				}
    				
    				n = x->first +1;
    				while(dp.count(n)>0){
    					dp[n]++;
    					if(max<dp[n]) max = dp[n];
    					n++;
    				}
    			}
    			return max;
    		}
    };
    

    三、优化措施

    后来结合其他大神的做法,优化如下:

    class Solution{
    	public:
    		int longestConsecutive(vector<int>& nums){
    			if(nums.size()<1) return 0;
    			if(nums.size()==1) return 1;
    			unordered_map<int,bool> dp;
    			for(int i=0;i<nums.size();i++){
    				dp[nums[i]] = false;
    			}
    			int maxNum = 0;
    
    			for (int i=0;i<nums.size();i++){
    				if(dp[nums[i]]) continue;
    				int len = 1;
    				dp[nums[i]] = true;
    				for(int j=nums[i]+1;dp.find(j)!=dp.end();j++){
    					dp[j] = true;
    					len++;
    				}
    				for(int j=nums[i]-1;dp.find(j)!=dp.end();j--){
    					dp[j] = true;
    					len++;
    				}
    			    maxNum = max(maxNum,len); 
    			}
    			return maxNum;
    		}
    };
    
    Runtime: 8 ms, faster than 96.28% of C++ online submissions for Longest Consecutive Sequence.
    Memory Usage: 10.2 MB, less than 57.69% of C++ online submissions for Longest Consecutive Sequence.
    
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    Java之ServiceLoader
    docker学习(3)--Dockfile详解
    docker学习(2)--基础命令
    docker学习(1)--基础概念
    dubbo学习(1)--简单的入门搭建实例
    Flume搭建及学习(基础篇)
    VM下--Linux根分区磁盘扩容
    Windows10下简单搭建zookeeper
    Windows10下搭建TensorFlow环境
    cmath库函数
  • 原文地址:https://www.cnblogs.com/siweihz/p/12269444.html
Copyright © 2011-2022 走看看