LeetCode 1920. 基于排列构建数组
给你一个 从 0 开始的排列 nums(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans 。
从 0 开始的排列 nums 是一个由 0 到 nums.length - 1(0 和 nums.length - 1 也包含在内)的不同整数组成的数组。
1 <= nums.length <= 1000
0 <= nums[i] < nums.length
nums 中的元素 互不相同
法一:创建一个结果数组,按题意赋值即可:
class Solution {
public:
vector<int> buildArray(vector<int>& nums) {
vector<int> ans(nums.size());
int index = 0;
for (int &i : ans) {
i = nums[nums[index]];
++index;
}
return ans;
}
};
如果输入数组nums的长度为n,此算法时间复杂度为O(n),空间复杂度为(1)。
法二:原地构建,由于nums中的值最大为999,因此可将某位置的结果值乘1000存在该位置上,之后再遍历一遍数组,每个元素都除1000即可:
class Solution {
public:
vector<int> buildArray(vector<int>& nums) {
int sz = nums.size();
for (int i = 0; i < sz; ++i) {
nums[i] += 1000 * (nums[nums[i]] % 1000);
}
for (int i = 0; i < sz; ++i) {
nums[i] /= 1000;
}
return nums;
}
};
如果输入数组nums的长度为n,此算法时间复杂度为O(n),空间复杂度为(1)。
浙公网安备 33010602011771号