LeetCode 268. Missing Number代码超时原因咨询
LeetCode 268. Missing Number 超时问题分析
题目描述
给定一个包含
n个不同数字的数组nums,数字范围为[0, n],返回该范围内缺失的唯一数字。示例1
- 输入:
nums = [3,0,1]- 输出:
2- 解释:
n = 3(数组有3个元素),数字范围为[0,3],2是范围内未出现在nums中的缺失数字。示例2
- 输入:
nums = [0,1]- 输出:
2- 解释:
n = 2(数组有2个元素),数字范围为[0,2],2是范围内未出现在nums中的缺失数字。约束条件
n == nums.length1 <= n <= 10^4- 数组
nums中的所有数字都是唯一的。
你的代码
class Solution { public: int Missing_Number(vector<int>& num) { int ans = 0; for(int i=0 ; i <= nums.size() ; i++){ bool flag = true; for(int j=0 ;j<=nums.size() -1 ; j++){ if(i == nums[j]){ flag = false; } else{ continue; } } if(flag == true){ ans = i; } } return ans; } };
超时原因
你的代码用了双重嵌套循环,时间复杂度为O(n²)。当n达到104时,总运算次数会达到108级别,这远超LeetCode的时间限制(通常题目允许的运算次数在106~107之间),因此触发了超时错误。
另外注意:函数参数是vector<int>& num,但循环里用的是nums.size(),变量名不一致,虽然测试用例通过了,但这是个笔误,建议修正。
优化方案
方案1:求和法
计算0到n的总和,减去数组元素的总和,差值就是缺失的数字。时间复杂度O(n),空间复杂度O(1):
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int total = n * (n + 1) / 2; int sum = 0; for (int num : nums) { sum += num; } return total - sum; } };
方案2:异或法
利用异或性质:a^a=0、0^a=a。将0到n的所有数与数组元素逐一异或,最终结果就是缺失数字。时间复杂度O(n),空间复杂度O(1):
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int res = n; for (int i = 0; i < n; ++i) { res ^= i ^ nums[i]; } return res; } };
方案3:排序法
先排序数组,遍历检查元素是否等于索引,找不到则返回n。时间复杂度O(n log n),空间复杂度O(1)(允许修改原数组):
class Solution { public: int missingNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(); for (int i = 0; i < n; ++i) { if (nums[i] != i) { return i; } } return n; } };
内容的提问来源于stack exchange,提问作者Abhimanyu
相关产品推荐
相关产品推荐

