今天刷到一个很特别的题目

要我们再常数级别的空间复杂度内解决。所以很明显不能额外做个哈希表。但是根据题目给出的数据范围以及数组长度来看。再原来的数组上就可以进行哈希。不过需要一些奇淫技巧。
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;
}
};
这篇博客探讨了一种在常数空间复杂度内解决数组中重复元素的方法,通过巧妙地利用数组自身作为哈希表。博主分享了具体的代码实现,该代码遍历数组,将每个元素的绝对值作为下标,如果该下标处的值为负,则说明之前遇到过此元素,从而找出重复项。这种方法避免了额外的数据结构,提高了效率。


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



