[LeetCode] 原地哈希

原理:将数组元素nums[i]的值作为下标,即nums[nums[i] - 1]

适用:可以使用哈希表完成,但限制空间复杂度O(1),且数组元素和数组下标(0 ~ n-1或 1 ~ n)有关

287. 寻找重复数 - 力扣(LeetCode) (leetcode-cn.com)

思路:不断把nums[i]与nums[nums[i] - 1]进行比较,如果不等则把nums[i]放在nums[i]-1位置,如果相等则找到了。即,1放在0的位置,2放在1的位置... 目标:使得i位置放的是值为i+1的数,然后才继续循环

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        for(int i = 0; i < nums.size(); ) {
            int tmpIdx = nums[i] - 1;
            if(tmpIdx != i) {
                if(nums[i] == nums[tmpIdx]) {
                    return nums[i];
                } else {
                    swap(nums[i], nums[tmpIdx]);
                }
            } else {
                i++;
            }
        }
        return 0;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值