题目

解法
1.常规做法
class Solution {
public:
vector<int> buildArray(vector<int>& nums) {//返回值类型为vector<int>,所以必须返回顺序表
vector<int>ret;
int size = nums.size();
int ans;
int i = 0;
while(i<size){
ans = nums[nums[i]];
ret.push_back(ans);//顺序表的插入
i++;
}
return ret;
}
};
2.原地算法:空间复杂度为O(1)
class Solution {
public:
vector<int> buildArray(vector<int>& nums) {//返回值类型为vector<int>,所以必须返回顺序表
int size = nums.size();
for(int i=0;i<size;i++){
nums[i]+=nums[nums[i]]%1000*1000;
}
for(int i=0;i<size;i++){
nums[i]/=1000;
}
return nums;
}//这种做法的空间复杂度为O(1)。
};
反思
考察知识点:顺序表的构建和插入、原地算法
踩的坑:1.首先一开始没有注意到返回值类型为vector<int>,所以构建了指针或者数组,但实际上需要我们构建vector顺序表;
2.原地算法,作为进一步控制空间复杂度的进阶算法,思路就是从原来数组的基础上进行修改,而不引入新的变量和顺序表。
3.可以优化的地方:可以看这个题解,是原地算法的另一种解法,但我没有看懂,原来是大名鼎鼎的灵茶山艾府!!!
1375

被折叠的 条评论
为什么被折叠?



