📅  最后修改于: 2023-12-03 15:11:19.002000             🧑  作者: Mango
这个问题是要求对于给定数组中的每一个元素,将其替换为数组中所有其他最小的元素。具体地,对于数组中第 $i$ 个位置的元素 $nums[i]$,将其替换为除 $nums[i]$ 之外的所有元素中的最小值。
例如,若给定数组为 $[5, 2, 6, 1]$,则需将其转换为 $[1, 5, 2, 6]$。
暴力法。对于数组中的每一个元素,遍历数组找到除其自身外的最小值,并替换。
时间复杂度:$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
优化暴力法。可以提前遍历数组,求出数组中的最小值 $\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
排序法。可以将数组排序后去除重复元素,并将最小值删去,以备替换。
时间复杂度:$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
单调栈法。可以利用单调栈维护一个单调递减的栈,栈中存储的是数组下标,并且可以保证当一个元素被弹出栈时,其左边的所有元素都大于该元素。从左往右遍历数组,将每个元素的下标入栈,当栈顶元素所对应的数大于当前元素时,就将其出栈,然后将栈顶元素所对应的数替换为当前元素。
时间复杂度:$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
本题有多种思路,但下标法较为复杂,这里就不展开讲解了。从时间复杂度上看,单调栈法是最优解,但代码实现相对来说也更难一些。其他思路则可根据具体情况选择。