作为一个电子信息专业的研究生,代码能力一坨。
为了提升代码能力,遂开启我的力扣刷题之旅。
题目以及测试用例如上。
我的想法
受到第一题《两数之和》答案的影响,我第一个想到的是一遍遍历+哈希表查找。
遍历一遍数组,把不重复项存进res数组,同时也存一份给哈希表用于查找之前已经出现过的数。然后再把res数组复制一份给nums。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set <int> hash;
vector <int> res;
for(int i = 0; i < nums.size(); i++){
if(hash.find(nums[i]) == hash.end()){
res.push_back(nums[i]);
hash.insert(nums[i]);
}
}
copy(begin(res), end(res), begin(nums));
return res.size();
}
};
ok,一遍过。但是果然,我能想到的别人肯定也能想到,内存占用过高。
反思
回头想想看还有没有什么能改进的地方。
1. 题目要求原地删除nums数组里的重复元素这里想复杂了。其实可以直接定一个变量j=0指向nums数组的开头。if条件每满足一次,j向后移位。
2. 题目中提到了是有序的数组,也就是说重复元素之可能与前一个元素重复,和再之前的不会产生重复,其实只用和当前的比较就可以。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int idx = 0;
for (int i = 1; i <nums.size(); i++) {
if (nums[i] != nums[idx]) {
idx++;
nums[idx] = nums[i]; // 将不重复的元素放入结果数组
}
}
return idx + 1; // 返回结果数组的长度
}
};
循环从1开始,因为nums[0]作为开始的元素肯定不可能重复。发现新元素之后,idx往后移动一位之后再将元素放入结果数组。