陣列中的最長連續子串行

2021-10-09 14:30:42 字數 1744 閱讀 1693

陣列中的最長連續子串行

給定無序陣列arr,返回其中最長的連續序列的長度(要求值連續,位置可以不連續,例如 3,4,5,6為連續的自然數)

輸入描述:

輸出兩行,第一行包括乙個整數n(1

≤n≤1

05

)n(1 \leq n \leq10^5)

n(1≤n≤

105)

,第二行包含n個整數,分別代表arr

[i](

1≤ar

r[i]

≤108

)arr[i](1 \leq arr[i] \leq 10^8 )

arr[i]

(1≤a

rr[i

]≤10

8)。輸出描述:

輸出乙個整數,代表最長連續子串行的長度。

示例1輸入

6

100 4 200 1 3 2

輸出
4
示例2

輸入

3

1 1 1

輸出
1
備註:

時間複雜度o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

,空間複雜度o(n

)o(n)

o(n)

。題解:

解法一:

直接對陣列進行排序,連續的數字必然挨在一塊,逐個遍歷一遍即可。

時間複雜度:o(n

)o(n)

o(n)

額外空間複雜度:o(1

)o(1)

o(1)

解法一**:

#include

#include

using

namespace std;

const

int n =

1e5+10;

int n;

int a[n]

;int

main

(void)}

printf

("%d\n"

,max

(max_len, len));

return0;

}

解法二:

使用雜湊表,hash表示 key 所在的最長連續序列的長度。逐個遍歷陣列元素,假設當前遍歷元素為 a[i],並且 a[i] 未在 hash **現,則按照以下規則更新:

時間複雜度:o(n

)o(n)

o(n)

額外空間複雜度:o(n

)o(n)

o(n)

解法二**:

#include

#include

using

namespace std;

int n, ret =1;

unordered_map<

int,

int> hash;

void

merge

(int less,

int more)

intmain

(void)}

printf

("%d\n"

, ret)

;return0;

}

最長連續子串行變種

在蒜廠年會上有乙個 在乙個環形的桌子上,有 n 個紙團,每個紙團上寫乙個數字,表示你可以獲得多少蒜幣。但是這個遊戲比較坑,裡面竟然有負數,表示你要支付多少蒜幣。因為這些數字都是可見的,所以大家都是不會出現的賠的情況。遊戲規則 每人只能抓一次,只能抓取一段連續的紙團,所有紙團上的數字和就是你可以獲得的...

最長連續子串行和

動態規劃 一維dp i 表示以i結尾的子陣列的最大和 以下 可以記錄子陣列的開始和結束位置 要求輸出子串行和的第乙個和最後乙個 include include 兩個輔助陣列 const int maxn 1000 int dp maxn int pre maxn 存放子串行的開始 int arr m...

最長回文子串行 最長公共子串行 最長連續回文子串

public class solution int result new int len 1 len 1 stringbuffer sb new stringbuffer s sb sb.reverse string rev sb.tostring result 0 0 0 下面兩個for迴圈相當於...