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)。

posted @ 2021-07-17 22:36  epiphanyy  阅读(12)  评论(0)    收藏  举报  来源