日渐头秃的代码日记 -- 第296场周赛第3题

83 阅读1分钟

替换数组中的元素

给你一个下标从 0 开始的数组 nums ,它包含 n 个 互不相同 的正整数。请你对这个数组执行 m 个操作,在第 i 个操作中,你需要将数字 operations[i][0] 替换成 operations[i][1] 。

题目保证在第 i 个操作中:

  • operations[i][0] 在 nums 中存在。
  • operations[i][1] 在 nums 中不存在。

请你返回执行完所有操作后的数组。

 

示例 1:

输入: nums = [1,2,4,6], operations = [[1,3],[4,7],[6,1]]
输出: [3,2,7,1]
解释: 我们对 nums 执行以下操作:
- 将数字 1 替换为 3 。nums 变为 [3,2,4,6] 。
- 将数字 4 替换为 7 。nums 变为 [3,2,7,6] 。
- 将数字 6 替换为 1 。nums 变为 [3,2,7,1] 。
返回最终数组 [3,2,7,1]

示例 2:

输入: nums = [1,2], operations = [[1,3],[2,1],[3,2]]
输出: [2,1]
解释: 我们对 nums 执行以下操作:
- 将数字 1 替换为 3 。nums 变为 [3,2] 。
- 将数字 2 替换为 1 。nums 变为 [3,1] 。
- 将数字 3 替换为 2 。nums 变为 [2,1] 。
返回最终数组 [2,1]

 

提示:

  • n == nums.length
  • m == operations.length
  • 1 <= n, m <= 10^5
  • nums 中所有数字 互不相同 。
  • operations[i].length == 2
  • 1 <= nums[i], operations[i][0], operations[i][1] <= 10^6
  • 在执行第 i 个操作时,operations[i][0] 在 nums 中存在。
  • 在执行第 i 个操作时,operations[i][1] 在 nums 中不存在。

解析

按照题目的操作顺序进行模拟,是可以完成95%的case,但是因为时间复杂度较高,导致最后几个case过不了,考虑到每次操作,题目都保证了当时的nums都是不重复的,所以可以用字典来记录,每个数字出现的位置,在进行替换的时候也方便替换

import copy
class Solution:
    def arrayChange(self, nums: List[int], operations: List[List[int]]) -> List[int]:
        nums_dict = dict()
        for i, n in enumerate(nums):
            nums_dict[n] = i
        for n, v in operations:
            i = nums_dict[n]
            nums[i] = v
            nums_dict[v] = i
        print(nums_dict, nums)
        return nums