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

\(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(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;
}

相关文章:

  • 2021-11-14
  • 2021-10-21
  • 2022-02-03
  • 2021-09-09
  • 2021-12-27
  • 2021-09-06
  • 2021-08-24
猜你喜欢
  • 2021-08-11
  • 2022-12-23
  • 2021-12-26
  • 2022-01-04
  • 2021-11-22
  • 2021-06-09
  • 2022-12-23
相关资源
相似解决方案