327. 區間和的個數 (歸併排序)
LeetCode: 327. 區間和的個數
上篇是暴力字首和 >> 時間複雜度
O
(
n
2
)
O(n^2)
O(n2)
部落格指路: 327. 區間和的個數 (暴力字首和)
歸併排序解法 優化 >> 時間複雜度 O ( n l o g n ) O(nlogn) O(nlogn)
思路:
- 分
- 核心程式碼
- 合 (區域性排序)
歸併排序
class Solution {
public int countRangeSum(int[] nums, int lower, int upper) {
int len = nums.length;
if(len == 0) return 0;
long[] pre = new long[len + 1];
// 必然
pre[0] = 0;
for (int i = 1; i < pre.length; i++) {
pre[i] = pre[i - 1] + nums[i - 1];
}
int ans = divde(pre, 0, pre.length - 1, lower, upper);
return ans;
}
public int divde(long[] arr, int left, int right, int lower, int upper){
// 終止條件
if(left == right) return 0;
int mid = left + (right - left) / 2;
// 分
int n1 = divde(arr, left, mid, lower, upper);
int n2 = divde(arr, mid + 1, right, lower, upper);
int ans = n1 + n2;
// 排序處理後
// 核心程式碼
int cnt = left;
int i = mid + 1;
int j = mid + 1;
while(cnt <= mid){
// 找到左邊界
while(i <= right && arr[i] - arr[cnt] < lower){
i++;
}
while(j <= right && arr[j] - arr[cnt] <= upper){
j++;
}
ans += j - i;
cnt++;
}
// 合
long[] sorted = new long[right - left + 1];
int a = left, b = mid + 1;
int index = 0;
while(a < mid + 1 || b <= right){
if(a > mid){
sorted[index++] = arr[b++];
}else if(b > right){
sorted[index++] = arr[a++];
}else {
//
if(arr[a] > arr[b]){
sorted[index++] = arr[b++];
}else {
// 小於等於
sorted[index++] = arr[a++];
}
}
}
// 更新原陣列
for (int k = 0; k < sorted.length; k++) {
arr[left + k] = sorted[k];
}
return ans;
}
}
官方題解: 區間和的個數
相關文章
- [leetCode]327. 區間和的個數LeetCode
- 歸併排序和基數排序排序
- 排序(2)--選擇排序,歸併排序和基數排序排序
- Leetcode 327. 區間和的個數 (字首和 + 離散化 + 樹狀陣列)LeetCode陣列
- 歸併排序求逆序數排序
- [排序] 歸併排序排序
- 【Leetcode每日一題】327. 區間和的個數(線段樹/樹狀陣列)LeetCode每日一題陣列
- 歸併和快速排序思想的延伸排序
- 逆序對的數量(歸併排序模板)排序
- 歸併排序排序
- 快速排序&&歸併排序排序
- 淺談歸併排序:合併 K 個升序連結串列的歸併解法排序
- 四、歸併排序 && 快速排序排序
- java歸併排序Java排序
- [java]歸併排序Java排序
- 歸併排序模板排序
- 歸併排序與快速排序的一個實現與理解排序
- ForkJoin和氣泡排序組合實現的歸併排序排序
- 歸併排序--二路排序排序
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 歸併排序--排序演算法排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法——歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 【分治演算法】歸併排序,快速排序和漢諾塔演算法排序
- 歸併排序 js demo排序JS
- C# 歸併排序C#排序
- 【筆記】歸併排序筆記排序
- 歸併排序例項排序
- 歸併排序的簡單理解排序
- O(lgn)的三種排序,快速排序、歸併排序、堆排序排序
- 排序演算法之 '歸併排序'排序演算法
- php實現 歸併排序,快速排序PHP排序
- 直播系統原始碼,實現快速排序和歸併排序原始碼排序
- 利用java實現插入排序、歸併排序、快排和堆排序Java排序
- HDU 4911 Inversion(歸併排序求逆序數)排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序