/* 哈希表:unordered_map */ classSolution { public: intduplicate(vector<int>& nums){ int length = nums.size(); unordered_map<int, int> map; map.reserve(length); int repeatNum = -1;
for (int i = 0; i < length; i ++) { if (map.find(nums[i]) == map.end()) { map.insert({nums[i], 1}); } else { repeatNum = nums[i]; break; } } return repeatNum; } };
/* 集合:unordered_set */ classSolution { public: intduplicate(vector<int>& nums){ int length = nums.size(); unordered_set<int> set; int repeatNum = -1;
for (int num : nums) { if (!set.insert(num).second) { repeatNum = num; break; } } return repeatNum; } };
/* 不使用额外空间
重排这个数组,从头到尾依次扫描这个数组的每个数字。 当扫描到下标 i 的数字时,首先比较这个数字 x 是否等于 i。 如果是,则接着扫描下一个元素; 如果不是,则将它和第 x 个数字进行比较。如果它等于第 x 个数字,交换第 i 个数字和第 x 个数字。 */ classSolution { public: intduplicate(vector<int>& nums){ int length = nums.size(); for (int i = 0; i < length; i ++) { while (nums[i] != i) { if (nums[i] == nums[nums[i]]) { return nums[i]; } swap(nums[i], nums[nums[i]]); } } return-1; } };