algorithm - 最小切片位置 - N 阶算法

标签 algorithm

给定一个由 N 个整数组成的非空零索引数组 A。一对整数 (P, Q) 满足 0 ≤ P < Q < N,称为数组 A 的切片 (注意切片至少包含两个元素)。切片 (P, Q) 的平均值是 A[P] + A[P + 1] + ... + A[Q] 除以 切片的长度。准确地说,平均值等于 (A[P] + A[P + 1] + ... + A[Q])/(Q − P + 1)。

写一个函数:

解决方案(int A[], int N);

给定一个由 N 个整数组成的非空零索引数组 A,返回具有最小平均值的切片的起始位置。 如果有多个切片具有最小平均值,则应返回此类切片的最小起始位置。

假设:

N为[2..100,000]范围内的整数; 数组 A 的每个元素都是 [−10,000..10,000] 范围内的整数。 复杂性:

预期的最坏情况时间复杂度为 O(N); 预期的最坏情况空间复杂度为 O(N),超出输入存储空间(不包括输入参数所需的存储空间)。

你能只发布只有 N 阶的解决方案吗?

最佳答案

如果 A 只有正数,您可以这样处理:

pos = 0
min_avg = A[0] + A[1]
for (i=2; i<N; i++)
    m = A[i-1] + A[i]
    if (m < min_avg)
        min_avg = m
        pos = i-1
return pos

这只是对两个数字的切片取平均值,因为较大切片的平均值不可能小于较小切片的最小值。

如果 A 有负数,你可以先向上调整所有值:

offset = min(A)
for (i=0; i<N; i++)
    A[i] -= offset

结合前面的算法:

offset = min(A) * 2              (because we're adding two numbers below)
pos = 0
min_avg = A[0] + A[1] - offset
for (i=2; i<N; i++)
    m = A[i-1] + A[i] - offset
    if (m < min_avg)
        min_avg = m
        pos = i-1
return pos

关于algorithm - 最小切片位置 - N 阶算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31734212/

相关文章:

java - 一种递归算法,用于在总和为给定整数的数组中查找两个整数

c++ - 生成随机 DAG

c - 需要关于如何实现这个的帮助..选择一个最好的数据结构

algorithm - big-O 表示法是对算法进行最佳、最差和平均情况分析的工具吗?

algorithm - 从列表中的元素创建所有可能的对,然后对它们进行均匀排序

深度优先搜索中的Python "RuntimeError: maximum recursion depth exceeded"

c# - 插入排序算法c#

algorithm - 这可以用线性时间复杂度解决吗?

algorithm - 如何找到图像处理算法的计算复杂度

algorithm - 麻将胜手算法