LeetCode #448 找到所有数组中消失的数字
基本思路
为了满足题目要求的不使用额外的存储空间(当然返回的数组除外),并且时间复杂度控制在O(n),最多只能常数级别遍历,因此考虑将原数组视作一个"哈希表"。
遍历原数组,将【1,n】上的值域映射到【0,n-】的坐标上,某个数x扫描到一次则将这个数x映射的 x-1的坐标处的值加上n。
然后再次遍历原数组,如果某个元素num【i】不超过n则说明这个数对应的映射未被扫描过,i+1则代表缺失的数,可以加入作为结果返回的vector数组中。
标程
1 class Solution { 2 public: 3 vector<int> findDisappearedNumbers(vector<int>& nums) { 4 int n = nums.size(); 5 for(auto& num : nums){ 6 int x = (num - 1) % n; 7 nums[x] += n; 8 } 9 vector<int>res; 10 for(int i = 0; i < n; i++){ 11 if(nums[i] <= n){ 12 res.push_back(i+1); 13 } 14 } 15 return res; 16 } 17 };
时间复杂度
O(N)
标签:
刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理