給定乙個未排序序列和乙個值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必須是新出現的。初始的時候...