返回介绍

solution / 2200-2299 / 2256.Minimum Average Difference / README

发布于 2024-06-17 01:03:08 字数 4924 浏览 0 评论 0 收藏 0

2256. 最小平均差

English Version

题目描述

给你一个下标从 0 开始长度为 n 的整数数组 nums 。

下标 i 处的 平均差 指的是 nums 中  i + 1 个元素平均值和  n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。

请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。

注意:

  • 两个数的 绝对差 是两者差的绝对值。
  •  n 个元素的平均值是 n 个元素之  除以(整数除法) n 。
  • 0 个元素的平均值视为 0 。

 

示例 1:

输入:nums = [2,5,3,9,5,3]
输出:3
解释:
- 下标 0 处的平均差为:|2 / 1 - (5 + 3 + 9 + 5 + 3) / 5| = |2 / 1 - 25 / 5| = |2 - 5| = 3 。
- 下标 1 处的平均差为:|(2 + 5) / 2 - (3 + 9 + 5 + 3) / 4| = |7 / 2 - 20 / 4| = |3 - 5| = 2 。
- 下标 2 处的平均差为:|(2 + 5 + 3) / 3 - (9 + 5 + 3) / 3| = |10 / 3 - 17 / 3| = |3 - 5| = 2 。
- 下标 3 处的平均差为:|(2 + 5 + 3 + 9) / 4 - (5 + 3) / 2| = |19 / 4 - 8 / 2| = |4 - 4| = 0 。 
- 下标 4 处的平均差为:|(2 + 5 + 3 + 9 + 5) / 5 - 3 / 1| = |24 / 5 - 3 / 1| = |4 - 3| = 1 。
- 下标 5 处的平均差为:|(2 + 5 + 3 + 9 + 5 + 3) / 6 - 0| = |27 / 6 - 0| = |4 - 0| = 4 。
下标 3 处的平均差为最小平均差,所以返回 3 。

示例 2:

输入:nums = [0]
输出:0
解释:
唯一的下标是 0 ,所以我们返回 0 。
下标 0 处的平均差为:|0 / 1 - 0| = |0 - 0| = 0 。

 

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105

解法

方法一:遍历

我们直接遍历数组 $nums$,对于每个下标 $i$,维护前 $i + 1$ 个元素的和 $pre$ 和后 $n - i - 1$ 个元素的和 $suf$,计算平均差的绝对值 $t$,如果 $t$ 小于当前最小值 $mi$,则更新答案 $ans = i$ 和最小值 $mi = t$。

遍历结束后,返回答案即可。

时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$。

class Solution:
  def minimumAverageDifference(self, nums: List[int]) -> int:
    pre, suf = 0, sum(nums)
    n = len(nums)
    ans, mi = 0, inf
    for i, x in enumerate(nums):
      pre += x
      suf -= x
      a = pre // (i + 1)
      b = 0 if n - i - 1 == 0 else suf // (n - i - 1)
      if (t := abs(a - b)) < mi:
        ans = i
        mi = t
    return ans
class Solution {
  public int minimumAverageDifference(int[] nums) {
    int n = nums.length;
    long pre = 0, suf = 0;
    for (int x : nums) {
      suf += x;
    }
    int ans = 0;
    long mi = Long.MAX_VALUE;
    for (int i = 0; i < n; ++i) {
      pre += nums[i];
      suf -= nums[i];
      long a = pre / (i + 1);
      long b = n - i - 1 == 0 ? 0 : suf / (n - i - 1);
      long t = Math.abs(a - b);
      if (t < mi) {
        ans = i;
        mi = t;
      }
    }
    return ans;
  }
}
class Solution {
public:
  int minimumAverageDifference(vector<int>& nums) {
    int n = nums.size();
    using ll = long long;
    ll pre = 0;
    ll suf = accumulate(nums.begin(), nums.end(), 0LL);
    int ans = 0;
    ll mi = suf;
    for (int i = 0; i < n; ++i) {
      pre += nums[i];
      suf -= nums[i];
      ll a = pre / (i + 1);
      ll b = n - i - 1 == 0 ? 0 : suf / (n - i - 1);
      ll t = abs(a - b);
      if (t < mi) {
        ans = i;
        mi = t;
      }
    }
    return ans;
  }
};
func minimumAverageDifference(nums []int) (ans int) {
  n := len(nums)
  pre, suf := 0, 0
  for _, x := range nums {
    suf += x
  }
  mi := suf
  for i, x := range nums {
    pre += x
    suf -= x
    a := pre / (i + 1)
    b := 0
    if n-i-1 != 0 {
      b = suf / (n - i - 1)
    }
    if t := abs(a - b); t < mi {
      ans = i
      mi = t
    }
  }
  return
}

func abs(x int) int {
  if x < 0 {
    return -x
  }
  return x
}
function minimumAverageDifference(nums: number[]): number {
  const n = nums.length;
  let pre = 0;
  let suf = nums.reduce((a, b) => a + b);
  let ans = 0;
  let mi = suf;
  for (let i = 0; i < n; ++i) {
    pre += nums[i];
    suf -= nums[i];
    const a = Math.floor(pre / (i + 1));
    const b = n - i - 1 === 0 ? 0 : Math.floor(suf / (n - i - 1));
    const t = Math.abs(a - b);
    if (t < mi) {
      ans = i;
      mi = t;
    }
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文