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 @   epiphanyy  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-07-17 open函数返回0
2020-07-17 UNIX网络编程卷一 学习笔记 第七章 套接字选项
点击右上角即可分享
微信分享提示