區間和的個數 leetcode327 歸併

2021-10-10 09:47:06 字數 1490 閱讀 3604

給定乙個整數陣列 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...