11.2Find All Numbers Disappeared in an Array数组
题目描述
给定一个长度为n的数组,其中包含范围从1到n的整数,有些整数重复了很多次,有些整数没有出现。求1到n中没有出现过的整数
输入输出样例
Input :[4, 3, 2, 7, 8, 2, 3, 1]
Output:[5, 6]
题解
核心思想:用数组本身当下标,数字出现过 → 就把对应位置标记成负数;最后还是正数的位置,就是没出现过的数字!
数字 x 对应下标 x-1
出现过 → 标记为负
还是正数 → 没出现过 → 就是答案
cpp
#include <iostream>
#include <vector>
using namespace std;
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> ans;
for (const int& num : nums) {// 用数字找它应该在的位置
int pos = abs(num) - 1;//abs(x)=x的绝对值
if (nums[pos] > 0) {
nums[pos] = -nums[pos];// 出现过 → 标记成负数
}
}
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] > 0) {
ans.push_back(i + 1);//把正数放到数组里,就是没出现过的数
}
}
return ans;
}
int main() {
vector<int> nums = { 4, 3, 2, 7, 8, 2, 3, 1 };
vector<int> res = findDisappearedNumbers(nums);
int count = res.size();
cout << "[";
for (const int &r : res) {
cout << r;
count--;
if (count) {
cout << ",";
}
}
cout << "]" << endl;
return 0;
}