LeetCode中for循环用.size()超时问题及.size()实现复杂度问询
关于LeetCode移除元素题中vector.size()的性能疑问
我在解决LeetCode 27题(移除元素)时发现了特殊的计时行为:
给定整数数组
nums和整数val,原地移除nums中所有val的实例,元素顺序可更改,返回nums中不等于val的元素数量。设nums中不等于val的元素数量为k,需满足:
- 修改
nums,使前k个元素为不等于val的元素,剩余元素及数组大小无关紧要。- 返回
k。
提交以下代码时出现超时:
class Solution { public: int removeElement(vector<int>& nums, int val) { int count=0; for(int i=0;i<nums.size();i++){ if(nums[i]==val){ for(int j=i;j+1<nums.size();j++){ nums[j]=nums[j+1]; count+=1; } i--; } } return nums.size()-count; } };
随后我改用变量记录nums.size()的值作为循环条件,代码在规定时间内完成运行:
class Solution { public: int removeElement(vector<int>& nums, int val) { int count=0,size=nums.size(); for(int i=0;i<size;i++){ if(nums[i]==val){ for(int j=i;j+1<size;j++){ nums[j]=nums[j+1]; count+=1; } i--; size--; } } return size; } };
我不理解为何两种写法有如此大的差异,想了解.size()的耗时、内部实现代码及其时间复杂度。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

