區間內累加和為規定值的最長子序列

2021-10-01 23:14:54 字數 1458 閱讀 5838

給定乙個未排序序列和乙個值num,然後求解該序列中的乙個連續子串行,使得這個子串行s的累加值等於num,而且s是所有子串行中最長的。要求時空複雜度都是o(n

)o(n)

o(n)

暴力方式,輪詢遍歷,這樣的時間複雜度特別高,無法接受。(n

)o(n)

o(n)

,雜湊計算的複雜度是o(1

)o(1)

o(1)

,所以總的時空複雜度都是o(n

)o(n)

o(n)

**特殊情況:**如果某乙個元素就滿足條件,上面的方式是無法獲取到資料的,因為如果直接計算,此時雜湊表是空的。為了處理特殊情況,我們在雜湊表中新增元素<0, -1>,此時第乙個元素如果命中,則可以計算結果。

給出**:

#include

#include

#include

std::tuple<

int,

int>

maxrange

(const std::vector<

int>

& arr,

int num)

int n = arr.

size()

;int maxlen =0;

int sum =0;

std::unordered_map<

int,

int> ump;

ump.

emplace

(std::

make_pair(0

,-1)

);// 處理第乙個特殊情況

for(

int i =

0; i < n;

++i)

int len = i - it-

>second;

if(len > maxlen)

}return tp;

}inline

void

print

(const std::tuple<

int,

int>

& tp)

intmain()

;auto tp =

maxrange

(arr,6)

;print

(tp)

; tp =

maxrange

(arr,4)

;print

(tp)

; tp =

maxrange

(arr,-2

);print

(tp)

; tp =

maxrange

(arr,

-1000);

print

(tp)

;return0;

}

這類問題,利用了區間加減計算的方式,是一種常用的處理方式。

累加和為aim的最長子陣列

參考 擴充套件1乙個陣列中要麼是奇數,要麼是偶數,求奇數和偶數相等的最長子陣列。思路用1表示奇數,用 1表示偶數,那麼就是求累加和為0的最長子陣列,參考上面 擴充套件2求乙個陣列怎樣劃分可以使得子陣列異或為0的個數最多。思路動態規劃 定義乙個dp陣列,dp i 表示以 i 結尾可以劃分的最多個數 對...

累加和位指定值的最長子陣列

package day 累加和位指定值的最長子陣列 這是乙個可伸縮的滑動視窗,不斷地在k值的上下波動,並且要不斷的判斷right是否越界,由於都是整數,所以left不會比right先到arr.length位置上。author administrator public class demo2 int ...

演算法 求陣列中累加和為定值的最長子陣列

o n n 的演算法,我想大家都應該很瞭如指掌,那我們就講一種o n 的演算法,借助map巧妙地解決。主要在思想上,其實很簡潔 後面有類似思想拓展題。演算法思想 我們準備乙個map來完成記錄操作。map的意義是從開始累加到i位置的和為sum的時候,此時陣列的下標i。且sum必須是新出現的。初始的時候...