【问题标题】:Checking if values in each row/column are unique in vector检查每行/列中的值在向量中是否唯一
【发布时间】:2026-01-11 04:00:01
【问题描述】:

我正在尝试弄清楚如何检查每一行和每一列,以查看每列/行是否有重复的数字。

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

网格:

{9, 7, 9}

{9, 6, 8}

{5, 1, 4}

第一行重复9,第一列也重复9。

我该如何解决这些问题?

【问题讨论】:

  • 您的矩阵中是否存在永远的值?就像例如-1?然后,您可以将其用作哨兵,并在检查重复项时对其进行检查。
  • 不清楚您如何处理“被阻止”字段,即如何“重新滚动”这些值。也许您可以创建一个单独的 nxn bool 结构,其中带有“被阻止”的标志?

标签: c++ vector nested duplicates


【解决方案1】:

您可以使用unordered_set数据结构来解决检查重复的问题。它基于hashtable data structure。它的好处是我们可以在常数时间 O(1) 内搜索特定元素。阅读更多here

您需要有n unordered_set 数据结构。所以最好有一个包含unordered_setvector

定义一个向量以包含n unordered_set

vector<unordered_set<int>> mySets(n);

现在我假设您使用值0 阻止了特定值,但只有当0 最初并未出现在您的网格中时,此假设才成立。

所以基本上我们为每一列都有一个unordered_set,在第j个unordered_set中的(i,j)位置插入一个元素之前,我们检查第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;
}

【讨论】:

  • @chariked 好吧,你自己提到如果 n 是用户输入,我们有一个 nxn 的网格。
  • @chariked 所以基本上 n 将是列数(也等于行数)。
  • 哦,好吧,只是想确定一下。谢谢
  • @chariked 您在哪一行收到此错误?
  • @chariked 你的意思是这条线向量> mySets(n);给出错误
最近更新 更多