leetcode:448. 找到所有数组中消失的数字
题目
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例:
输入:nums = [4,3,2,7,8,2,3,1]输出:[5,6]
输入:nums = [1,1]输出:[2]
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
解答 & 代码
原地哈希:数组 nums 中含有 n 个数,且所有数恰好都在区间 [1, n],那么可以让 nums[i] 的符号代表数字 i + 1 是否出现过,即,如果最终 nums[i] 为负数,则说明数字 i + 1 出现过,否则未出现
class Solution {public:vector<int> findDisappearedNumbers(vector<int>& nums) {// 遍历数组,修改(原地的)哈希表for(int i = 0; i < nums.size(); ++i){int idx = abs(nums[i]) - 1;if(nums[idx] > 0)nums[idx] = -nums[idx];}// 再次遍历数组,如果 nums[i] 是正数,则说明 i + 1 未出现过vector<int> answer;for(int i = 0; i < nums.size(); ++i){if(nums[i] > 0)answer.push_back(i + 1);}return answer;}};
复杂度分析:设数组 nums 中含有 n 个数
- 时间复杂度 O(n)
- 空间复杂度 O(1)
执行结果:
执行结果:通过执行用时:40 ms, 在所有 C++ 提交中击败了 84.56% 的用户内存消耗:32.9 MB, 在所有 C++ 提交中击败了 60.27% 的用户
