LeetCode 448.找到所有数组中消失的数字
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例 2:
输入:nums = [1,1]
输出:[2]
提示:
n == nums.length
1 <= n <= 105^55
1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
我们可以遍历nums,把遍历到的元素按1到n放到指定为止,具体做法是把当前遍历到的下标为i的元素nums[i]与下标为nums[i] - 1位置的元素交换,如果发现目标位置和源位置的值相同,说明目标位置已经是该值了,此时将该值置为-1,最后下标为-1的值就是数组中消失的数字:
class Solution {
public:vector<int> findDisappearedNumbers(vector<int>& nums) {int n = nums.size();for (int i = 0; i < n; ) {if (nums[i] == -1) {++i;continue;}if (nums[i] - 1 == i) {++i;continue;}if (nums[i] != nums[nums[i] - 1]) {swap(nums[i], nums[nums[i] - 1]);} else {nums[i] = -1;++i;}}vector<int> ans;for (int i = 0; i < n; ++i) {if (nums[i] == -1) {ans.push_back(i + 1);}}return ans;}
};
如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。