📅  最后修改于: 2023-12-03 15:26:38.223000             🧑  作者: Mango
在处理数组问题时,有时需要找出数组中除了某个元素之外的最小值和最大值。常见的应用场景是在求解数组的平均值、中位数、标准差等统计量时,需要先排除极值,避免对结果产生影响。
排序是最基本的方法,可以先将数组排序,再将最小的N-1个元素相加,得到最小和;再将最大的N-1个元素相加,得到最大和。由于排序的大部分算法时间复杂度为O(NlogN),因此该解法的时间复杂度通常为O(NlogN)。
def get_min_max_sum(arr):
arr.sort()
min_sum = sum(arr[:-1])
max_sum = sum(arr[1:])
return min_sum, max_sum
线性扫描法可以只扫描一次数组,同时记录下最小值、次小值和最大值、次大值,再减去对应的元素即可得到最小和和最大和。该方法的时间复杂度为O(N)。
def get_min_max_sum(arr):
smallest = min(arr[0], arr[1])
second_smallest = max(arr[0], arr[1])
largest = max(arr[0], arr[1])
second_largest = min(arr[0], arr[1])
for i in range(2, len(arr)):
if arr[i] < smallest:
second_smallest = smallest
smallest = arr[i]
elif arr[i] < second_smallest:
second_smallest = arr[i]
if arr[i] > largest:
second_largest = largest
largest = arr[i]
elif arr[i] > second_largest:
second_largest = arr[i]
min_sum = sum(arr) - largest
max_sum = sum(arr) - smallest
return min_sum, max_sum
选择哪种方法取决于实际情况。排序法虽然时间复杂度较高,但可用于任意数组类型和任意计算方法。线性扫描法虽然时间复杂度较低,但仅适用于查找最小和和最大和的情况。具体应用中,需要考虑数组大小、排序稳定性等因素,选择最优的算法。