Leetcode 128. Longest Consecutive Sequence (union find)
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
Your algorithm should run in O(n) complexity.
Example:
Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is[1, 2, 3, 4]. Therefore its length is 4.
tag : union find
create the array first and then union the consecutive number (3,4) (4,5) -- > have the same root
e.g: 100 4 200 1 3 2
100 4 200 1 3 2
My method: weighted union find with hashmap;
Solution 1
class Solution {
//union find
class QuickUnion {//with array
HashMap<Integer, Integer> map = new HashMap<>(); // id, parent
HashMap<Integer, Integer> sz = new HashMap<>(); // id size
int count;//how many components
QuickUnion(int[] nums){
count = 1;
for(int i = 0; i<nums.length;i++) {
map.put(nums[i],nums[i]);
sz.put(nums[i],1);
}
}
Integer root(int p){
if(!map.containsKey(p)) return null; // there is no such id
while(p != map.get(p)){
int temp = map.get(map.get(p));//with path compression , set parent -> grandparent, map.get(i): i 's parent
map.put(p, temp);
p = map.get(p);
}
/*while(id[p] != p){//find the root when to stop
id[p] = id[id[p]];
p = id[p];
}*/
return p;
}
boolean find(int p, int q){
return root(p)==root(q);
}
void union(int p, int q){
//get root
Integer pid = root(p);
Integer qid = root(q);
System.out.println(qid);
if(pid == null || qid == null) return; // check the null
//if(pid == qid) return; // check the integer,. heck if in the same set
if(pid.equals(qid)) return;
if(sz.get(pid) > sz.get(qid)){
map.put(qid, pid);
sz.put(pid, sz.get(pid)+sz.get(qid));
if(sz.get(pid)>count) count = sz.get(pid);
}else{
map.put(pid, qid);
sz.put(qid, sz.get(pid)+sz.get(qid));
if(sz.get(qid)>count) count = sz.get(qid);
}
}
}
public int longestConsecutive(int[] nums) {
//create a union find
//union the elemnt 4 (3,5) -> 3,4,5
if(nums.length == 0) return 0;
QuickUnion qu = new QuickUnion(nums);
for(int i = 0; i<nums.length; i++){
System.out.println("num of i"+i+" ");
if(nums[i] != Integer.MIN_VALUE) qu.union(nums[i],nums[i]-1);//check the boundary
if(nums[i] != Integer.MAX_VALUE) qu.union(nums[i],nums[i]+1);//[2147483646,-2147483647,0,2,2147483644,-2147483645,2147483645]
System.out.println(qu.count+" ");
}
return qu.count;
}
}
Solution: hashset
remove and contains in ahshset
flow: remove the element : visited that element
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length==0) return 0;
//use hashset
HashSet<Integer> set = new HashSet<>();//non duplicate element
for(int num : nums){
set.add(num);
}
int max = 1;
for(int num : nums){
int len = 0;
int left = 1, right = 1;
if(!set.contains(num)) continue;
while(set.contains(num-left)){
set.remove(num-left); left++; len++;
}
while(set.contains(num+right)){
set.remove(num+right); right++; len++;
}
len++;
set.remove(num);
max = Math.max(len, max);
}
return max;
}
}
quick find and quick union and weightedunion find
public class QuickFind{
private int[] id; // set all root of current id
public QuickFind(int N){
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
//Check if p and q have the same id.
boolean find(int p, int q){
return id[p]==id[q];
}
//union pq
void unite(int p, int q){
int pid = id[p];//change pid to q
for(int i = 0; i <id.length; i++){
if(id[i] == pid) id[i] = id[q];
}
}
}
public class QuickUnion{
private int[] id; //represent the parent instead of root
public QuickUnion(int N){
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
//Check if p and q have the same id.
boolean find(int p, int q){
return root(p)==root(q);
}
//get the root
int root(int i){
while(i != id[i]) i = id[i];//id[i] parent i: children
return i;
}
//union p q
void unite(int p, int q){
//find root first
int i = root(p);
int j = root(q);
id[i] = j;
}
}
//avoid the tall trees , keep track ther size of each component
public class WeightedQuickUnion{
private int[] id; //represent the parent instead of root
private int[] sz;
int count;
public WeightedQuickUnion(int N){
count = N;
id = new int[N];
sz = new int[N];
for (int i = 0; i < N; i++){
id[i] = i;
sz[i] = 1;
}
}
//Check if p and q have the same id.
boolean find(int p, int q){
return root(p)==root(q);
}
//get the root
int root(int i){
while(i != id[i]) {
// path compression
id[i] = id[id[i]];
i = id[i];//id[i] parent i: children
}
return i;
}
//union p q
void unite(int p, int q){
//find root first
int i = root(p);
int j = root(q);
if(sz[i]<sz[j]){ //samller tree to larger tree
id[i] = j; sz[j]+=sz[i];
}else {
id[j] = i; sz[i]+=sz[j];
}
count--;
}
}
Leetcode 128. Longest Consecutive Sequence (union find)的更多相关文章
- [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- [LeetCode] 128. Longest Consecutive Sequence 解题思路
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- Java for LeetCode 128 Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- leetcode 128. Longest Consecutive Sequence ----- java
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- [leetcode]128. Longest Consecutive Sequence最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...
- LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ...
- Leetcode#128 Longest Consecutive Sequence
原题地址 1. 把所有元素都塞到集合里2. 遍历所有元素,对于每个元素,如果集合里没有,就算了,如果有的话,就向左向右拓展,找到最长的连续范围,同时在每次找的时候都把找到的删掉.这样做保证了同样的连续 ...
- 128. Longest Consecutive Sequence(leetcode)
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- 【LeetCode】128. Longest Consecutive Sequence
Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longest con ...
随机推荐
- 毕业设计 python opencv实现车牌识别 预处理
主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuow ...
- 阿里云 Ubuntu16.04 部署 LAMP
1.更新软件源 sudo apt-get update 2.安装Apache sudo apt-get install apache2 3.查看Apache是否安装成功 apache2 –v 如下所示 ...
- Web开发中FormData对象的使用
参考: FormData 对象的使用 - Web API 接口 | MDN
- IHttpAsyncHandler IHttpHandler
1.建立 .ashx 文件 2.异步HTTPHandler的实现https://www.cnblogs.com/HQFZ/p/5688759.html 3.Asp.net异步IHttpAsyncHan ...
- 第一章javascript简介
javascript 当诞生于1995 最开始是目的是处理在服务器端进行的表单验证:让其在服务器端验证改为在服务端验证,大大提高速度(当时网络慢) 如今javascript是一门功能全面的语言,包含闭 ...
- vue+iview中的table表格导出excel表格
一.iveiw框架中table中有exportCsv()方法可以导出.csv后缀文件,类似于excel文件,但是并不是excel文件. 二.实现table表格导出excel文件利用Blob.js 和 ...
- python django 基本测试 及调试
#########20181110from django.db import modelsfrom blog.models import Article, Author, TagAuthor.obje ...
- 理解 Linux backlog/somaxconn 内核参数
https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/ 各参数的含义:h ...
- express --- session详解
之前一直做前端相关的工作,所以不太清楚session,也没有主动了解,最近在学node,对session的认识又有所加深,故总结之. 注: 关于session的一些配置问题,可以看这里. 第一部分: ...
- Node调试之node-inspect工具
1.全局安装node-inspect模块: npm install -g node-inspect 2.通过谷歌浏览器打开:chrome://flags/#enable-devtools-experi ...