原地标记/交换
一、原地标记
题干:题目限制空间复杂度
思路:
step1:想出空间o(n)map方法
step2:以原数组下标做o(n)map方法的key,想办法在数据上做手脚
step3:再遍历时,检查数据是否被做了手脚
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> res;
int size=nums.size();
for(auto num:nums){
int temp = (num - 1) % size;
nums[temp] += size;
}
for(int i=0;i<size;i++){
if(nums[i]<=size){
res.push_back(i+1);
}
}
return res;
}
};
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int size=nums.size();
// if(size<2) return res;
for(auto num:nums){
int temp=(num-1)%size;
nums[temp]+=size;
}
for(int i=0;i<size;i++){
if(nums[i]>size*2){
res.push_back(i+1);
}
}
return res;
}
};
二、原地交换
题干:限制空间复杂度,且正好数据与数组下标有关系
思路:
step1:找到数据与数组下标的关系
step2:遍历数组,将 满足条件的数据 与 对应数组下标原位置数据交换,即遍历完成应达到效果——每个满足条件的数据都交换到了对应的下标位置。
step3:遍历数组,找到某个下标未配对的组合
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int size=nums.size();
for(int i=0;i<size;){
if(nums[i]>0&&nums[i]<=size){
int temp=nums[i];
if(nums[temp-1]==temp){
++i;
}else{
nums[i]=nums[temp-1];
nums[temp-1]=temp;
}
}else{
++i;
}
}
int res=0;
for(;res<size&&nums[res]==res+1;res++);
return res+1;
}
};
Comments | 0 条评论