GEEKアルゴリズムの道——配列の重み付け
配列が重複要素を除去する問題は一般的に最も基本的で,あまり難しくなく,ほとんどの場合STLアルゴリズムや容器の性質を直接使えば済む.テーマを見てみましょう.
タイトル1
並べ替えられた配列を入力し、重複要素を除去し、新しい配列の長さを出力します.要件:連続したメモリで操作し、別の配列に追加のメモリ領域を割り当てないでください.挙栗:入力[1,1,2]、出力2.
ぶんせき
コンテナを追加で作成できる場合は、setを使用してvectorの値をsetに渡してから戻すことができます.set自体が重複しない性質を持っているからです.以下ではsetを用いたコードを先に示しますが、もちろん本テーマには向いていません.追加作成はできません.STLアルゴリズムuniqueも使用できます.STLアルゴリズムを用いなければ,自己書き込みサイクルで判断操作を行うことが考えられる.
コード#コード#
setバージョン(本題以外の答え)
Uniqueバージョン
ループ判定
タイトル1
並べ替えられた配列を入力し、重複要素を除去し、新しい配列の長さを出力します.要件:連続したメモリで操作し、別の配列に追加のメモリ領域を割り当てないでください.挙栗:入力[1,1,2]、出力2.
ぶんせき
コンテナを追加で作成できる場合は、setを使用してvectorの値をsetに渡してから戻すことができます.set自体が重複しない性質を持っているからです.以下ではsetを用いたコードを先に示しますが、もちろん本テーマには向いていません.追加作成はできません.STLアルゴリズムuniqueも使用できます.STLアルゴリズムを用いなければ,自己書き込みサイクルで判断操作を行うことが考えられる.
コード#コード#
setバージョン(本題以外の答え)
//Remove Duplicates from Sorted Array
//Date:2016-04-05
//Author:Sin_Geek
// O(n), O(n)
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main()
{
vector<int> a{1, 1, 2, 2, 3};
set<int> b(a.cbegin(), a.cend());
a.assign(b.cbegin(), b.cend());
cout << a.size() <<endl;
return 0;
}
Uniqueバージョン
//Remove Duplicates from Sorted Array
//Date:2016-04-05
//Author:Sin_Geek
// O(n), O(1)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> a{1, 1, 2, 2, 3};
cout << distance(a.begin(), unique(a.begin(), a.end())) << endl;
return 0;
}
ループ判定
//Remove Duplicates from Sorted Array
//Date:2016-04-05
//Author:Sin_Geek
// O(n), O(1)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a{1, 1, 2, 2, 3};
if (a.empty())
{
cout << 0 << endl;
return 0;
}
int index = 0;
for (int i = 1; i < a.size(); ++i)
{
if (a[index] != a[i])
a[++index] = a[i];
}
cout << index + 1 << endl;
return 0;
}