原地哈希表

今天刷到一个很特别的题目
在这里插入图片描述
要我们再常数级别的空间复杂度内解决。所以很明显不能额外做个哈希表。但是根据题目给出的数据范围以及数组长度来看。再原来的数组上就可以进行哈希。不过需要一些奇淫技巧。
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;
     }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值