給定乙個整數陣列 nums,返回區間和在 [lower, upper] 之間的個數,包含 lower 和 upper。
區間和 s(i, j) 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
說明:
最直觀的演算法複雜度是 o(n2) ,請在此基礎上優化你的演算法。
示例:
輸入: nums = [-2,5,-1], lower = -2, upper = 2,
輸出: 3
解釋: 3個區間分別是: [0,0], [2,2], [0,2],它們表示的和分別為: -2, -1, 2。
思路與演算法
設字首和陣列為sum,若按一般的查詢的思想,由於sum陣列無序,所以我們需要用雙重for迴圈進行遍歷,時間複雜度為n^2,時間複雜度過高。此時,我們就可以考慮歸併排序的思想。
對任意乙個區間,我們都可以用
sum[i]-sum[j]//sum[i]表示num[0--size-1]的和
來表示
結合歸併排序思想,將sum陣列分成兩部分進行處理,前部分n1尋找符合條件區間,和後部分n2尋找符合條件區間,最後處理n1和n2合併的區間。
假設兩部分陣列的區間已經尋找完畢,繼續尋找n1,n2合併部分的區間。如果兩部分是有序的,那麼就可以只用logn的速度進行查詢了。
int
countrangesumrecursive
(long
long
* sum,
int lower,
int upper,
int left,
int right)
else
// 隨後合併兩個排序陣列
int sorted[right - left +1]
;memset
(sorted,0,
sizeof
(sorted));
int p1 = left, p2 = mid +1;
int p =0;
while
(p1 <= mid || p2 <= right)
else
if(p2 > right)
else
else}}
for(
int i =
0; i < right - left +
1; i++
)return ret;}}
intcountrangesum
(int
* nums,
int numssize,
int lower,
int upper)
return
countrangesumrecursive
(sum, lower, upper,
0, numssize)
;}
Leetcode 3題目解答
leetcode 3題目解答 乙個字串,要得到連續各個元素都不同的最長子串長度。該函式返回乙個maxlen即最長子串的長度,用乙個hashmap存放字母以及其對應下標,利用for迴圈裡的i遍歷該string,則對於每個字母,有以下兩種情況 1 若當前字母不在hashmap中則放入,用乙個len來記錄...
leetcode 3 三數之和
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class solu...
leetcode 3三數之和
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 如下 class s...