INPUT : [3,3,3,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0]
OUTPUT : [[3,3,3],[2,2,2],[1,1,1,1,1],[0,0,0,0,0,0,0,0,0,0]]
Input是int的向量,而Output是int的向量向量。目的是在时间方面以最有效的方式做到这一点。
我目前使用的解决方案是:
vector<vector<int> results;
vector<int> result;
for(int i = 0 ; i < list.size() - 1 ; i++ ){
result.push_back(list[i]);
if ( list[i] != list[i+1]){
results.push_back(result);
result.clear();
}
}
result.push_back(list[list.size()-1]);
results.push_back(result);
答案 0 :(得分:0)
您应尽可能使用standard algorithm library
这是一种可能的实施方式:
template <class T>
auto make_clusters(std::vector<T>& v) -> std::vector<std::vector<T>>
{
std::vector<std::vector<T>> clusters;
auto cluster_begin = v.begin();
while (cluster_begin != v.end())
{
auto elem = *cluster_begin;
auto cluster_end = std::find_if(cluster_begin, v.end(),
[&](int e) { return e != elem; });
clusters.emplace_back(std::distance(cluster_begin, cluster_end), elem);
cluster_begin = cluster_end;
}
return clusters;
}
答案 1 :(得分:-1)
你关闭了。你已经找到了你的边界问题,但考虑一下集群界面会发生什么:
..2,2,3,3...
^ ^
i i+1
您将输入else
(如果条件与原始else if
完全相反,则不需要if
)并忘记添加最后2
。如果向量中没有重复项,例如
`{1,2,3,4}`
除了空集群,你不会添加任何东西!因此,您总是希望添加数字,而不是您在群集中或结束它。如果您要结束群集,也想要添加并清除群集。
for(int i = 0 ; i < sorted.size()-1 ; i++ ){
cluster.push_back(sorted[i]);
if ( sorted[i] != sorted[i+1]){
clusters.push_back(cluster);
cluster.clear();
}
}
最后,正如@ tobi303所提到的那样,最后一个元素缺失了。使用单个元素({3}
)的列表尤其明显。请注意,在任何情况下都不会添加最后一个群集,无论它是最后一个新元素还是最终群集。
因此,一旦我们退出for
,我们需要再检查一次(不是真的) - 如果群集为空,则意味着最后一个元素不是它的一部分,而是一个新元素。否则,最后一个集群尚未添加,您需要将最后一个元素附加到它,然后添加集群。我把这个留给你了。