logologo

小和问题

Aug 21, 2023

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。

暴力解法

public int comparator(int[] arr) {
  if (arr == null || arr.length < 2)
    return 0;

  int res = 0;
  for (int i = 1; i < arr.length; i++) {
    for (int j = 0; j < i; j++) {
      res += arr[j] < arr[i] ? arr[j] : 0;
    }
  }
  return res;
}

归并排序批量计算

/**
 * 小和问题
 *
 * @param arr
 * @return
 */
public int smallSum(int[] arr) {
  if (arr == null || arr.length < 2)
    return 0;

  return process(arr, 0, arr.length - 1);
}

private int process(int[] arr, int l, int r) {
  if (l == r)
    return 0;
  int mid = l + ((r - l) >> 1);
  return process(arr, l, mid) + process(arr, mid + 1, r) + merge(arr, l, mid, r);
}

private int merge(int[] arr, int l, int mid, int r) {
  int[] help = new int[r - l + 1];
  int i = 0, p1 = l, p2 = mid + 1, res = 0;
  while (p1 <= mid && p2 <= r) {
    res += arr[p1] < arr[p2] ? arr[p1] * (r - p2 + 1) : 0;
    help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
  }

  while (p1 <= mid)
    help[i++] = arr[p1++];
  while (p2 <= r)
    help[i++] = arr[p2++];
  for (i = 0; i < help.length; i++)
    arr[l + i] = help[i];

  return res;
}

C++Java
浙ICP备2021022773号    2022-PRESENT © ZhengKe