今天刷到一个很特别的题目
要我们再常数级别的空间复杂度内解决。所以很明显不能额外做个哈希表。但是根据题目给出的数据范围以及数组长度来看。再原来的数组上就可以进行哈希。不过需要一些奇淫技巧。
1.假设遍历到了num[i]。那我们就再num[abs(num[i])-1]处对原来的数取反。然后每次遍历到一个新的数据的时候。我们判断这个数取绝对值减一对应的下标对应的元素是否为负数。若为负数,说明之前遍历到了
代码如下
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
// char tag[100001];
// memset(tag, 0x00, sizeof(tag));
// vector<int> ans;
// for(int i=0;i<nums.size();i++){
// if(tag[nums[i]]==-1){
// ans.push_back(nums[i]);
// }
// tag[nums[i]] = -1;
// }
// return ans;
/*正确思路:原地哈希*/
vector<int> ans;
for(int i=0;i<nums.size();i++){
int t = abs(nums[i]);
if(nums[t-1]<0){
ans.push_back(t);
}else{
nums[t-1] *=-1;
}
}
return ans;
}
};