LC题目:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。
例如:输入数组为: nums = [1, 1, 2, 3, 4, 4, 5]
则输出为:5,nums = [1,2,3,4,5]
此时,函数返回新的长度 5 ,并输出处理过的新数组
当然,也得考虑数组越界的问题。
提示:
解决思路
使用双指针解决:前指针 后指针
前指针指向的值等于后指针指向的值,后指针不动;
后指针指向的值不等于前指针指向的值,那么前指针往后退一步,然后再把前指针指向的值赋给后指针。
特殊情况
考虑如下数组
nums = [1 2 3 4 5 6]
原数组无重复元素,如果我们再遍历一次数组,则是没有必要的。所以,我们可以在处理前加一个判断,当front - later >1时,在进行遍历操作。
算法实现
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int front = 1, later = 1;
while (front < n) {
if (nums[front] != nums[front - 1]) {
if (front - later > 1)
{
nums[later] = nums[front];
}
++later;
}
++front;
}
return later;
}
};
类的实现
void text_01()
{
Solution S;
vector<int> nums= { 1, 1, 2, 3, 4, 4, 5 };
int n = S.removeDuplicates(nums);
cout << "新数组的大小:" << n << endl;
cout << "新数组: " << '\n';
for (int i = 0; i < n; i++) {
cout << nums[i] << ' ';
}
}
主函数
int main()
{
text_01();
system("pause");
return 0;
}
输出结果
整体代码实现
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int front = 1, later = 1;
while (front < n) {
if (nums[front] != nums[front - 1]) {
if (front - later > 1)
{
nums[later] = nums[front];
}
++later;
}
++front;
}
return later;
}
};
//类的实现
void text_01()
{
Solution S; //类的实例化
vector<int> nums= { 1, 1, 2, 3, 4, 4, 5 }; //创建原数组
int n = S.removeDuplicates(nums); //函数调用
cout << "新数组的大小:" << n << endl;
cout << "新数组: " << '\n'; // 打印输出处理过的数组
for (int i = 0; i < n; i++) {
cout << nums[i] << ' ';
}
}
int main()
{
text_01();
system("pause");
return 0;
}
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(1)。
说明:
题目来源
作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2gy9m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。