[每日一题2020.06.27] leetcode #41 set 内部交换

方法一 利用set 空间\(O(n)\) 时间 \(O(n)\)

利用一个set存储映射关系, 然后直接从1 - size遍历找出第一个不在set中的元素就可以

int firstMissingPositive(vector<int>& nums) {
    set<int> s;
    for (int i = 0; i < nums.size(); ++i)
    {
        s.insert(nums[i]);
    }
    for (int i = 1; i <= nums.size() + 1; ++i)
    {
        if(!s.count(i)) return i;
    }
    return 1;
}

方法二 交换 空间\(O(1)\) 时间 \(O(n)\)

直接在数组本身上操作, 空间只有交换时的临时tmp

通过交换使满足nums[i] = i + 1的元素归位

然后从头开始寻找第一个不满足的元素就是所求 , 如果全部满足, 就输出size+1

int firstMissingPositive(vector<int>& nums) {
    for (int i = 0; i < nums.size(); ++i) {
        while (nums[i] >= 1 && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1]) {
            swap(nums[i], nums[nums[i] - 1]);
        }
    }
    for (int i = 0; i < nums.size(); ++i) {
        if (nums[i] != i + 1) return (i + 1);
    }
    return nums.size() + 1;
}
posted @ 2020-06-27 19:16  roccoshi  阅读(192)  评论(2编辑  收藏  举报