📌  相关文章
📜  用所有其他最小的数组元素替换每个元素(1)

📅  最后修改于: 2023-12-03 15:11:19.002000             🧑  作者: Mango

用所有其他最小的数组元素替换每个元素

介绍

这个问题是要求对于给定数组中的每一个元素,将其替换为数组中所有其他最小的元素。具体地,对于数组中第 $i$ 个位置的元素 $nums[i]$,将其替换为除 $nums[i]$ 之外的所有元素中的最小值。

例如,若给定数组为 $[5, 2, 6, 1]$,则需将其转换为 $[1, 5, 2, 6]$。

思路1

暴力法。对于数组中的每一个元素,遍历数组找到除其自身外的最小值,并替换。

时间复杂度:$O(n^2)$。

以下是 Python 代码片段:

def replace_with_min(nums):
    n = len(nums)
    for i in range(n):
        min_num = float('inf')
        for j in range(n):
            if i != j:
                min_num = min(min_num, nums[j])
        nums[i] = min_num
    return nums
思路2

优化暴力法。可以提前遍历数组,求出数组中的最小值 $\min_{nums}$,再遍历数组替换即可。

时间复杂度:$O(n^2)$。

以下是 Python 代码片段:

def replace_with_min(nums):
    n = len(nums)
    min_num = float('inf')
    for i in range(n):
        min_num = min(min_num, nums[i])
    for i in range(n):
        nums[i] = min_num if nums[i] != min_num else float('inf')
    for i in range(n):
        min_num = min(nums)
        nums[i] = min_num
    return nums
思路3

排序法。可以将数组排序后去除重复元素,并将最小值删去,以备替换。

时间复杂度:$O(n\log n)$。

以下是 Python 代码片段:

def replace_with_min(nums):
    unique_nums = sorted(list(set(nums)))
    if len(unique_nums) < 2:
        return nums
    min_num = unique_nums[0]
    unique_nums.remove(min_num)
    for i in range(len(nums)):
        nums[i] = unique_nums[0] if nums[i] != min_num else min_num
    return nums
思路4

单调栈法。可以利用单调栈维护一个单调递减的栈,栈中存储的是数组下标,并且可以保证当一个元素被弹出栈时,其左边的所有元素都大于该元素。从左往右遍历数组,将每个元素的下标入栈,当栈顶元素所对应的数大于当前元素时,就将其出栈,然后将栈顶元素所对应的数替换为当前元素。

时间复杂度:$O(n)$。

以下是 Python 代码片段:

def replace_with_min(nums):
    n = len(nums)
    stack = []
    for i in range(n):
        while stack and nums[stack[-1]] > nums[i]:
            j = stack.pop()
            nums[j] = nums[i]
        stack.append(i)
    min_num = min(nums)
    for i in range(n):
        nums[i] = min_num if nums[i] != min_num else float('inf')
    for i in range(n):
        min_num = min(nums)
        nums[i] = min_num
    return nums
总结

本题有多种思路,但下标法较为复杂,这里就不展开讲解了。从时间复杂度上看,单调栈法是最优解,但代码实现相对来说也更难一些。其他思路则可根据具体情况选择。