我正在试图弄明白我如何检查每一排&列,以查看每列/每行是否有任何重复的数字。
例如,假设一个3x3网格得到以下内容:
网格:
{9, 7, 9}
{9, 6, 8}
{5, 1, 4}
第一行的副本为9,第一行的副本也为9.
我该如何解决这些问题?
答案 0 :(得分:1)
您可以使用unordered_set数据结构来解决检查重复项的问题。它基于hashtable data structure
。关于它的好处是我们可以在恒定时间O(1)中搜索特定元素。更多地了解here。
您需要拥有n
unordered_set
个数据结构。因此,最好有一个vector
,其中包含unordered_set
。
定义一个包含n
unordered_set
的矢量:
vector<unordered_set<int>> mySets(n);
现在我假设您使用值0
阻止特定值,但只有当0
最初未出现在您的网格中时,此假设才有效。
所以基本上我们为每个列都有一个unordered_set
,在第j (i,j)
位置unordered_set
处插入一个元素之前,我们会检查第j unordered_set
是否包含它或不,如果它和不是0 ,那么我们的网格还没有达到解决方案。对于行,我们只保留一个unordered_set
,mySet
,它在遍历每一行后被清除。
现在,您可以像这样实施checkSolution()
方法:
bool checkSolution()
{
unordered_set<int> mySet;//for each row
for (size_t i=0;i<myGrid.size();i++)
{
for (size_t j=0;j<myGrid[i].size();j++)
{
if(mySets[j].find(myGrid[i][j]) != mySets[j].end() && myGrid[i][j] != 0)
return false;
else
mySets[j].insert(myGrid[i][j]);
if(mySet.find(myGrid[i][j]) != mySet.end() && myGrid[i][j] != 0)
return false;
else
mySet.insert(myGrid[i][j]);
}
mySet.clear();
}
return true;
}
您还可以实现一个解决方案,其中每列只有一个unordered_set
,每行有n
unordered_set
,但是您必须按列主顺序遍历网格。
以下是示例程序:
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
bool checkSolution();
int myGrid[3][3] = {{0,2,3},
{4,5,6},
{0,8,9}};// 0 indicates blocked values
int main()
{
if(checkSolution())
cout<<"No duplicates exist";
else cout<<"Duplicates exist";
}
bool checkSolution()
{
int n = 3;
vector<unordered_set<int> > mySets(n);
unordered_set<int> mySet;
for(int i = 0;i < sizeof(myGrid)/sizeof(myGrid[0]); ++i)
{
for(int j = 0;j < sizeof(myGrid[i])/sizeof(myGrid[0][0]);++j)
{
if(mySets[j].find(myGrid[i][j]) != mySets[j].end() && myGrid[i][j] != 0)
return false;
else mySets[j].insert(myGrid[i][j]);
if(mySet.find(myGrid[i][j]) != mySet.end() && myGrid[i][j] != 0)
return false;
else mySet.insert(myGrid[i][j]);
}
mySet.clear();
}
return true;
}