LeetCode 327 區間和的個數 歸併排序

2021-10-10 07:56:46 字數 1731 閱讀 8397

①.求區間和,一般先構建字首和陣列進行資料預處理,可以 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 ...