①.求區間和,一般先構建字首和陣列進行資料預處理,可以 o(1) 得到任意區間和。
②.查詢元素,一般先進行排序,利用單調性可以快速的縮減查詢範圍,減少時間複雜度。
③.歸併排序包含了兩個過程:從上往下的分解:把當前區間一分為二,直至分解為若干個長度為1的子陣列;從下往上的合併:兩個有序的子區域兩兩向上合併。
④.對於本題,歸併過程中,右區間中元素分別和左區間中元素的差即原陣列的各區間和,利用有序可減少重複的比較操作。
class
solution
int result =0;
vector<
long
long
>
temp
(size)
;//用於合併兩個有序陣列的臨時陣列
mergesort
(presum,lower,upper,temp,
0,size-
1,result)
;return result;
}void
mergesort
(vector<
long
long
>
& presum,
int lower,
int upper,vector<
long
long
>
& temp,
int left,
int right,
int&result)
return;}
int mid = left+
(right-left)/2
;mergesort
(presum,lower,upper,temp,left,mid,result)
;//使 [left,mid] 有序
mergesort
(presum,lower,upper,temp,mid+
1,right,result)
;//使 [mid+1,right] 有序
//合併之前先統計
int i = left ;
// i 指向左區間
int j_left = mid+1;
int j_right = mid+1;
// j_left、j_right 指向右區間,i < j,相減得到區間和
while
( i < mid+1)
// i 固定時,j 越大差越大;j 固定時,i 越大差越小
j_right = j_left;
while
( j_right <= right && presum[j_right]
- presum[i]
<= upper)
//找到上限位置
i++;}
//合併
leetcode327 區間和的個數
給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。示例 輸入 nums...
leetCode 327 區間和的個數
給定乙個整數陣列nums,返回區間和在 lower,upper 之間的個數,包含lower和upper。區間和s i,j 表示在nums中,位置從i到j的元素之和,包含i和j i j 說明 最直觀的演算法複雜度是o n 2 請在此基礎上優化你的演算法。示例 輸入 nums 2,5,1 lower 2...
leetcode 327 區間和的個數 C語言
演算法思想 使用歸併排序的演算法思想 1.使用sums i 陣列放0 i 1的累加和,sums 0 0 2.對於任意的i j,lower sums i sums j upper滿足條件,則為一種可能的序列區間 3.對於有序的陣列,取符合條件的返回,可使用雙指標的方法。void print long ...