longest-consecutive-sequence(最长连续序列)

https://www.nowcoder.com/practice/57d83a2501164168841c158a7535b458?tpId=46&tqId=29052&tPage=2&rp=2&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

关于Set用法链接:Set用法链接

思路一:题目说要O(n)的时间解决,但我第一时间想的是先排序,然后就找连续序列即可。找连续序列是线性扫描的, 时间主要是在排序上, 所以时间复杂度是O(n*logn)


class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        int n = num.size();
		if(n <= 0)
			return 0;

		sort(num.begin(), num.end());
		int res = 0;//最终结果

		for(int i = 0; i < n; ){
			int sum = 1; //当前最长长度
			//和前一位比较
			while(i + 1 <n && (num[i +1] - num[i] == 1 || num[i+1] == num[i] ) ){
				if(num[i+1] - num[i] == 1)//是连续的加+1
					sum++;
				i++;
			
				
			}
			i++;
			res = res > sum ? res :sum;//更新

		}
		return res;


    }
};

思路二:把数据放到一个集合,然后扫描原来的数组,发现在集合的话就把其删除,并查找其左右邻居


class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        int n = num.size();
		if(n <= 0)
			return 0;

		set<int>Set;
		for(int i = 0; i < n; i++)//放到集合
			Set.insert(num[i]);

		int res = 1; 
		for(int i = 0; i < n; i++){
			if(Set.find(num[i]) == Set.end() )
				continue;

			//如果集合有Num[i],就把它删除,并查找它的邻居num[i] - 1
			//和num[i] + 1;
			Set.erase(num[i]);

			int left = num[i] - 1;
			int right = num[i] +1;
			//查找左邻居
			while(Set.find(left) != Set.end()){
				//cout<<"left: "<<left<<endl;
				Set.erase(left--);
			
			}
			//查找右邻居
			while(Set.find(right) != Set.end() ){
				//cout<<"right : "<<right<<endl;
				Set.erase(right++);
			}
			//最后更新即可
			res = res > (right - left  - 1) ? res : (right - left - 1);
		}
		return res;


    }
};

思路三:把思路二的Set换成unordered_map 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值