Easy
题目描述
给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:
- 目标数组 target 最初为空。
- 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组的 index[i] 处插入值 nums[i]。
- 重复前面的步骤,直到在 nums 和 index 中都没有要读取的元素。
请你返回目标数组。
题目保证数组的插入操作是有效的。
示例 1:
输入:nums = [0,1,2,3,4], index = [0,1,2,2,1]
输出:[0,4,1,3,2]
解释:
nums index target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
3 2 [0,1,3,2]
4 1 [0,4,1,3,2]
示例 2:
输入:nums = [1,2,3,4,0], index = [0,1,2,3,0]
输出:[0,1,2,3,4]
解释:
nums index target
1 0 [1]
2 1 [1,2]
3 2 [1,2,3]
4 3 [1,2,3,4]
0 0 [0,1,2,3,4]
示例 3:
输入:nums = [1], index = [0]
输出:[1]
提示:
- 1 <= nums.length, index.length <= 100
- nums.length == index.length
- 0 <= nums[i] <= 100
- 0 <= index[i] <= i
解题思路
这道题是一个典型的数组插入模拟题,核心思路是按照题目描述的规则逐步构建目标数组。
解题思路
题目要求我们根据给定的数值数组和索引数组,按顺序在指定位置插入元素来构建目标数组。关键在于理解插入操作的含义:在指定位置插入元素时,该位置及其后面的所有元素都会向右移动一位。
算法步骤
- 创建一个空的目标数组 target
- 遍历 nums 和 index 数组,对于每一对 (nums[i], index[i]):
- 在 target 数组的 index[i] 位置插入 nums[i]
- 原来在 index[i] 及之后位置的元素自动后移
大多数编程语言都提供了数组或列表的插入方法,可以直接使用。这种方法虽然时间复杂度较高,但由于题目约束数组长度最多为100,性能完全可以接受。
推荐解法:直接使用语言内置的插入方法进行模拟,代码简洁易懂。
代码实现
class Solution {
public:
vector<int> createTargetArray(vector<int>& nums, vector<int>& index) {
vector<int> target;
for (int i = 0; i < nums.size(); i++) {
target.insert(target.begin() + index[i], nums[i]);
}
return target;
}
};
class Solution:
def createTargetArray(self, nums: List[int], index: List[int]) -> List[int]:
target = []
for i in range(len(nums)):
target.insert(index[i], nums[i])
return target
public class Solution {
public int[] CreateTargetArray(int[] nums, int[] index) {
List<int> target = new List<int>();
for (int i = 0; i < nums.Length; i++) {
target.Insert(index[i], nums[i]);
}
return target.ToArray();
}
}
var createTargetArray = function(nums, index) {
let target = [];
for (let i = 0; i < nums.length; i++) {
target.splice(index[i], 0, nums[i]);
}
return target;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n²) | 每次插入操作需要移动后续元素,最坏情况下每次移动O(n)个元素 |
| 空间复杂度 | O(n) | 需要额外的目标数组存储结果 |