345. 数组求和
因为小千数学加法考试不及格,作为惩罚,她的哥哥给她出了一道数学加法题。给定一个数组A,找到数组A中所有小于当前位置A[i]的数字,并求出所有小于A[i]的数字之和,保存在B[i]的位置上。小千还是不会这个题目,聪明的你能帮帮小千得到这个新的数组吗?
样例
样例 1:
输入:
[2,4,8,3]
输出:
[0,5,9,2]
解释:
小于2的有[0];
小于4的有[2,3],和为5;
小于8的有[2,4,3],和为9;
小于3的有[2]
注意事项
1<=n<=50000
public class Solution {
/**
* @param arr: An array
* @return: An array
*/
public int[] getSum(int[] arr) {
int[] ret = new int[arr.length];
System.arraycopy(arr, 0, ret, 0, arr.length);
//归并排序
int start = 0;
int end = arr.length - 1;
mergeSort(ret, start, end);
int sum = 0;
int[] values=new int[50000];
for (int value : ret) {
values[value]=sum;
sum += value;
}
int[] result = new int[arr.length];
for (int i = 0; i < result.length; i++) {
result[i] = values[arr[i]];
}
return result;
}
/**
* @param arr: An array
* @return: An array
*/
public int[] getSum(int[] arr) {
int[] ret = new int[arr.length];
System.arraycopy(arr, 0, ret, 0, arr.length);
//归并排序
int start = 0;
int end = arr.length - 1;
mergeSort(ret, start, end);
int sum = 0;
HashMap<Integer, Integer> hap = new HashMap<>();
for (int value : ret) {
hap.put(value, sum);
sum += value;
}
int[] result = new int[arr.length];
for (int i = 0; i < result.length; i++) {
result[i] = hap.get(arr[i]);
}
return result;
}
public void mergeSort(int[] arr, int start, int end) {
//判断拆分的不为最小单位
if (end - start > 0) {
//再一次拆分,知道拆成一个一个的数据
mergeSort(arr, start, (start + end) / 2);
mergeSort(arr, (start + end) / 2 + 1, end);
//记录开始/结束位置
int left = start;
int right = (start + end) / 2 + 1;
//记录每个小单位的排序结果
int index = 0;
int[] result = new int[end - start + 1];
//如果查分后的两块数据,都还存在
while (left <= (start + end) / 2 && right <= end) {
//比较两块数据的大小,然后赋值,并且移动下标
if (arr[left] <= arr[right]) {
result[index] = arr[left];
left++;
} else {
result[index] = arr[right];
right++;
}
//移动单位记录的下标
index++;
}
//当某一块数据不存在了时
while (left <= (start + end) / 2 || right <= end) {
//直接赋值到记录下标
if (left <= (start + end) / 2) {
result[index] = arr[left];
left++;
} else {
result[index] = arr[right];
right++;
}
index++;
}
//最后将新的数据赋值给原来的列表,并且是对应分块后的下标。
for (int i = start; i <= end; i++) {
arr[i] = result[i - start];
}
}
}
}