區間和的個數 心累之旅

2021-09-29 09:31:11 字數 1705 閱讀 1102

*depr:乙個整數陣列 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。

coding

`class solution

}

} return res;

}// 優化解法(使用treemap)

public int countrangesum2(int nums, int lower, int upper)

treemapmap = new treemap<>();

long sums = new long[nums.length];

sums[0] = nums[0];

for (int i = 1; i < nums.length; i++)

int res = 0;

for (int i = 0; i < nums.length; i++)

for (integer count : map.submap(sums[i] - upper, true, sums[i] - lower, true).values())

integer count = map.get(sums[i]);

if (count == null) else

map.put(sums[i], count);

} return res;

}//merge

//利用歸併排序(o(nlogn))

public static int countrangesum(int nums, int lower, int upper)

long sums = new long[nums.length];

sums[0] = nums[0];

for(int i=1;i= e) else

} int mid = (s+e)/2;

int r1 = mid+1;

int r2 = mid+1;

long copy = new long[e-s+1]; //臨時陣列

int res = merge(sums, s, mid, lower, upper)+merge(sums, mid+1, e, lower, upper); //歸併排序

for(int i = s ; i <= mid ; i ++)

while(r2 <= e && sums[r2] - sums[i] <= upper)

res += (r2 - r1);

}//進行排序合併

int k = copy.length-1;

int a = mid;

int b = e;

while(a>=s && b>mid)else

}while(a>=s)

while(b>mid)

system.arraycopy(copy,0,sums,s,e-s+1);

return res;

}

327 區間和的個數

今天的題目還是看了一陣子 我是鏈結 意思是任意子區間內所有元素的和要在lower和upper之間,可以取等 所以題目中 0,0 2,2 都指向各自位置的元素,0,2 就是從第0個元素 一直加到 第2 個元素 等於 2 所以這就是為什麼輸出是3.class solution sum nums i fo...

327 區間和的個數

給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。想到了字首和,同時由...

327 區間和的個數

題目描述 給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。示例 輸入...