トピック
leetcode26。
並べ替えられた配列内の重複を削除する並べ替えられた配列を指定すると、繰り返し要素を削除して、各要素が1回だけ表示されるようにし、削除された配列の新しい長さを返す必要があります。
余分な配列スペースを使用しないでください。入力配列をその場で変更し、O(1)の余分なスペースを追加する必要があります。
例1:
配列nums = [1,1,2]の場合、
関数は新しい長さ2を返す必要があり、元の配列numsの最初の2つの要素が1、2に変更されます。
新しい長さを超える配列内の要素を考慮する必要はありません。
例2:
nums = [0,0,1,1,1,2,2,3,3,4]の場合、
関数は新しい長さ5を返す必要があり、元の配列numsの最初の5つの要素が変更されます。 0、1、2、3、4に。
新しい長さを超える配列内の要素を考慮する必要はありません。
コード
#include <vector>
using namespace std;
class Solution {
public:
// C++
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) {
return 0;
}
auto it = nums.begin();
int val = *it;
++it;
while(it != nums.end()){
if (*it == val) {
// erase返回值指向删除元素的下一位置
it = nums.erase(it);
}else{
val = *it;
++it;
}
}
return nums.size();
}
// C
// 思路:快慢指针
int removeDuplicates(int* nums, int numsSize) {
if (0 == numsSize) {
return 0;
}
int i = 0;
for(int j = 1; j < numsSize; ++j){
if (nums[j] != nums[i]){
++i;
nums[i] = nums[j];
}
}
return i + 1;
}
};
テスト
#include <iostream>
void print(const vector<int>& nums) {
cout << "nums : ";
for(auto& i : nums) {
cout << i << " ";
}
cout << std::endl;
}
int main() {
std::vector<int> vc = {
2, 2, 3, 4, 5, 5, 6, 7};
print(vc);
Solution s;
s.removeDuplicates(vc);
print(vc);
std::cin.get();
return 0;
}
- 結果
nums : 2 2 3 4 5 5 6 7
nums : 2 3 4 5 6 7