LeetCode-442. Find All Duplicates in an Array

Description

Given an array of integers, 1a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

Example

Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]

Solution 1(C++)

static int x=[](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        vector<int> res;
        for(int i=0; i<nums.size(); i++){
            if(nums[abs(nums[i])-1] < 0) res.push_back(abs(nums[i]));
            else nums[abs(nums[i])-1] = 0-nums[abs(nums[i])-1];
        }
        return res;
    }
};

Solution 2(C++)

static const auto _____ = []()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        // 思路:对数字加数组长度不影响其对数组长度求余的值
        // 如果数组中的元素最终超过2倍数组长度大小的话说明该元素对应的位置的数字出现了两次
        int size = nums.size();
        vector<int> result;
        for(int i = 0; i < size; i++){
            nums[(nums[i] - 1) % size] += size;
        }

        for(int i = 0; i < size; i++){
            if(nums[i] > 2*size) result.push_back(i+1);
        }
        return result;
    }
};

算法分析

第一道medium难度的题,后面应该都是medium难度的题目了,除非真的做不出来了,可以回去看一看easy难度的题。对于这一道题,解法一是我之前也有在easy难度中用过的方法。对于解法二也是很有意思的。

与解法一的相同点就是,都尝试在一次遍历的过程中将数组中出现一次与出现两次的值区分开。都考虑到了数组元素的分布特点是在1~n之间。那么元素值作为索引值,让对应的元素发生变化。区别是,解法一发生的变化是取反,解法二是值增加数组长度的这个常数值。

程序分析

略。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zy2317878/article/details/79958138
文章标签: LeetCode Array
个人分类: LeetCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭