检查每个行/列中的值在向量中是否唯一

时间:2017-03-17 06:16:39

标签: c++ vector nested duplicates

我正在试图弄明白我如何检查每一排&列,以查看每列/每行是否有任何重复的数字。

例如,假设一个3x3网格得到以下内容:

网格:

{9, 7, 9}

{9, 6, 8}

{5, 1, 4}

第一行的副本为9,第一行的副本也为9.

我该如何解决这些问题?

1 个答案:

答案 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_setmySet,它在遍历每一行后被清除。

现在,您可以像这样实施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;
}