当前位置:   article > 正文

leetcode每日一题(5.8)详解_给你一个长度为n的数组nums

给你一个长度为n的数组nums

442. 数组中重复的数据

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

示例 1:

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

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

示例 3:

输入:nums = [1]
输出:[]
  • 1
  • 2

思路:时间复杂度O(n),空间复杂度O(1)
常规做法是计数存数并返回即可,但是这题不能开额外的存储空间,说明必须要在原数组中进行操作,首先我们就能想到要用哈希。原数组中元素 1 < = x < = n 1<=x<=n 1<=x<=n,而数组下标范围是 0 < = i d x < = n − 1 0<=idx<=n-1 0<=idx<=n1,我们可以用下标idx表示元素x的情况,需要注意idxx的范围,要表示x的情况需x-1x第一次出现时 idx变为负数,当x第二次出现时,idx为负数,此时我们可以将x存数result数组中并返回

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        vector<int>v;
        for(int i=0;i<nums.size();i++)
        {
            int x=abs(nums[i]);
            if(nums[x-1]>0)nums[x-1]=-nums[x-1];
            else v.push_back(x);
        }
        return v;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/390591
推荐阅读
相关标签
  

闽ICP备14008679号