LeetCode 力扣 128 最長連續序列

2021-10-05 05:27:56 字數 3090 閱讀 1664

給乙個陣列,求出連續的數字最多有多少個,時間複雜度要求是o(n)

首先想一下最直接的暴力破解。我們可以用乙個hashset把給的陣列儲存起來。然後再考慮陣列的每個數,比如這個數是n,然後看n + 1在不在hashset中,然後再看n + 2在不在,接下來n + 3n + 4直到在hashset中找不到,記錄當前的長度。然後繼續考慮下乙個數,並且更新最長的長度。

public

intlongestconsecutive

(int

nums)

int max =0;

for(

int i =

0; i < nums.length; i++

) max = math.

max(max, count);}

return max;

}

當然時間複雜度不符合題意了,我們想一下優化方案。

上邊的暴力破解有乙個問題就是做了很多沒必要的計算,因為我們要找最長的連續數字。所以如果是陣列54367,當我們遇到5的時候計算一遍567。遇到4又計算一遍4567。遇到3又計算一遍34567。很明顯從3開始才是我們想要的序列。

換句話講,我們只考慮從序列最小的數開始即可。實現的話,當考慮n的時候,我們先看一看n - 1是否存在,如果不存在,那麼從n開始就是我們需要考慮的序列了。否則的話,直接跳過。

public

intlongestconsecutive

(int

nums)

int max =0;

for(

int i =

0; i < nums.length; i++

) max = math.

max(max, count);}

}return max;

}

這個時間複雜度的話就是o(n)了。雖然for迴圈裡套了while迴圈,但每個元素其實最多也就是被訪問兩次。比如極端情況98765498765迴圈的時候都不會進入while迴圈,只有到4的時候才進入了while迴圈。所以總共的話,98765也只會被訪問兩次,所以時間複雜度就是o(n)了。

參考 這裡 ,雖然不容易直接想到,但還是有跡可循的。

本質上就是把連續的序列進行合併,思路就是考慮我們先解決了小問題,然後大問題怎麼解決。

假如我們已經了有連續的序列,123 和 56,並且序列的邊界儲存了當前序列的長度。12

333<

- 序列長度56

22<

- 序列長度

此時來了乙個數字 4

我們只需要考慮 4-1

=3,以 3 結尾的序列的長度

以及 4+1

=5,以 5 開頭的序列的長度

所以當前就會得到乙個包含 4 的,長度為 3+1

+2=6 的序列12

3456

3322

<

- 序列長度

此時把兩個邊界的長度進行更新12

3456

6326

<

- 序列長度

此時如果又來了 7

我們只需要考慮 7-1

=6,以 6 結尾的序列的長度

以及 7+1

=8,以 8 開頭的序列的長度,但是不存在以 8 開頭的序列,所以這個長度是 0

所以當前就會得到乙個包含 7 的,長度為 6+1

+0=7 的序列 12

3456

7632

6<

- 序列長度

此時把兩個邊界的長度進行更新12

3456

7732

67<

- 序列長度

實現的話,我們可以用乙個hashmap,儲存以當前key為邊界的連續序列的長度。可以再結合**理解一下。

public

intlongestconsecutive

(int

nums)

//找到以左邊數字結尾的最長序列,預設為 0

int left = map.

getordefault

(num -1,

0);//找到以右邊數開頭的最長序列,預設為 0

int right = map.

getordefault

(num +1,

0);int sum = left +

1+ right;

max = math.

max(max, sum)

;//將當前數字放到 map 中,防止重複考慮數字,value 可以隨便給乙個值

map.

put(num,-1

);//更新左邊界長度

map.

put(num - left, sum)

;//更新右邊界長度

map.

put(num + right, sum);}

return max;

}

兩種思路其實都是正常的操作,仔細想的話還是可以想出來的。

更多詳細通俗題解詳見 leetcode.wang 。

128 最長連續序列 力扣

題意理解 給定乙個未排序陣列,求最大連續數字的長度。這個連續數字可以任意位置。問題分析 方法1 排序 遍歷 遍歷要點是記錄連續的數字,我用的方法是和前一位比,如果比前一位大1,長度 1,如果相等,不做處理,其他情況,拿當前長度更新最大值,重置當前值為1.方法複雜度是o nlogn 方法2 集合 遍歷...

力扣LeetCode 128題 最長連續序列

題目 給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。要找連續序列的長度,從結果可以看出,主要是為了排序,排序之後,遍歷結果就可以進行連續長度的更新。但是排...

力扣題解系列 128 最長連續序列

給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 輸入 100,4 200,1 3,2 輸出 4解釋 最長連續序列是 1,2,3,4 它的長度為 4。對於在陣列中的元素i,若i 1或者i 1也在陣列中,則它們在乙個連續序列中。但是同時考慮i 1和i 1就比較麻煩,而...