*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 請在此基礎上優化你的演算法。示例 輸入...