LeetCode_映射_简单_645.错误的集合

x33g5p2x  于2022-04-14 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(263)

1.题目

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]

示例 2:
输入:nums = [1,1]
输出:[1,2]

提示:
2 <= nums.length <= 104
1 <= nums[i] <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-mismatch

2.思路

(1)哈希表
(2)映射
具体思路参考如何同时寻找缺失和重复的元素

3.代码实现(Java)

//思路1————哈希表
public int[] findErrorNums(int[] nums) {
    //键/值:数组nums中的元素/该元素出现的次数
    HashMap<Integer,Integer> map = new HashMap<>();
    int[] res = new int[2];
    int n = nums.length;
    //sum为1...n的元素之和
    int sum = (1 + n) * n / 2;
    for (int i = 0; i < n; i++) {
        if (!map.containsKey(nums[i])) {
            map.put(nums[i], 1);
            //sum减去数组nums中所有不重复元素的和,剩下的值就是丢失的数字
            sum -= nums[i];
        } else {
            //当前元素nums[i]已存在与map中,说明该元素就是重复元素
            res[0] = nums[i];
        }
    }
    res[1] = sum;
    return res;
}
//思路2————映射
public int[] findErrorNums(int[] nums) {
    int n = nums.length;
    //dup为重复的元素,初始值为-1
    int dup = -1;
    for (int i = 0; i < n; i++) {
        //数组nums中元素的最小值是1,所以将元素转换成索引时需要-1
        int index = Math.abs(nums[i]) - 1;
        if (nums[index] < 0) {
            /*
                如果当前索引对应的元素值为负数,则说明该元素之前出现过一次,
                而现在再次出现,说明该元素即为重复的元素     
            */
            dup = Math.abs(nums[i]);
        } else {
            //将每个索引对应的元素变成负数,标记该元素,表示该元素出现过一次
            nums[index] *= -1;
        }
    }
    //miss为重复的元素,初始值为-1
    int miss = -1;
    for (int i = 0; i < n; i++) {
        if (nums[i] > 0) {
            //当前元素为正数,说明该元素对应的索引值没有出现过,将索引转换成元素即可
            miss = i + 1;
            break;
        }
    }
    return new int[]{dup, miss};
}

相关文章