【数据结构】二维数组中的元素查重
任务描述
设二维数组a[1..m, 1..n] 含有m*n 个整数。写一个算法判断a中所有元素是否互不相同。
编程要求
输入
多组数据,每组数据有m+1行,第一行为二维数组的行数m和列数n,之后m行为输入的二维数组。当n=0且m=0时输入结束。
输出
对于每组数据分别输出一行,若二维数组中存在相等元素则输出“YES”,否则输出“NO”。
输入样例:
在这里给出一组输入。例如:
4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 4
1 2 3 4
5 6 7 8
1 9 10 11
0 0
输出样例:
在这里给出相应的输出。例如:
NO
YES解题步骤如下:
步骤 1:初始化与循环读取输入
- 程序启动后,进入
main函数,定义整数m(行数)和n(列数),用于存储二维数组的规模。 - 通过
while (cin >> m >> n)循环持续读取多组数据,每次读取一组m和n,作为当前二维数组的行数和列数。 
步骤 2:判断输入结束条件
- 在循环内部,首先检查
if (m == 0 && n == 0):若m和n均为 0,说明输入结束,执行break跳出循环,程序终止。 
步骤 3:初始化重复检测工具
- 对于非结束条件的
m和n,定义set<int> elements(集合容器),用于存储已读取的数组元素(利用集合 “元素唯一” 的特性实现去重和重复检测)。 - 定义
bool hasDuplicate = false,作为标记变量:true表示存在重复元素,false表示暂时无重复。 
步骤 4:读取二维数组元素并检测重复
- 通过两层嵌套循环读取二维数组的所有元素:
- 外层循环(
i从 0 到m-1):控制行数,依次读取每一行元素。 - 内层循环(
j从 0 到n-1):控制列数,依次读取当前行的每个元素。 
 - 外层循环(
 - 对于每个读取的元素
num:- 若
hasDuplicate已为true(已发现重复),则跳过后续检测,仅继续读取元素(避免因未读完数据导致后续输入错位)。 - 若
hasDuplicate为false(未发现重复),则检查num是否已在elements中:- 若
elements.find(num) != elements.end()(元素已存在),则将hasDuplicate设为true(标记发现重复)。 - 若元素不存在,则将
num插入elements集合中,继续检测下一个元素。 
 - 若
 
 - 若
 
步骤 5:输出检测结果
- 当当前二维数组的所有元素读取完毕后,根据
hasDuplicate的值输出结果:- 若
hasDuplicate为true(存在重复元素),输出YES。 - 若
hasDuplicate为false(所有元素互不相同),输出NO。 
 - 若
 
步骤 6:重复执行
- 完成一组数据的检测后,循环回到步骤 1,继续读取下一组
m和n,重复上述流程,直到输入0 0结束程序。 
C++代码:
#include <iostream>
#include <set>
using namespace std;int main() {int m, n;// 循环读取多组数据,直到m和n都为0while (cin >> m >> n) {if (m == 0 && n == 0) {break;}set<int> elements;  // 用于存储已出现的元素,自动去重bool hasDuplicate = false;  // 标记是否存在重复元素// 读取二维数组元素for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {int num;cin >> num;// 若已发现重复,只需继续读取数据但不检查if (hasDuplicate) {continue;}// 检查当前元素是否已存在if (elements.find(num) != elements.end()) {hasDuplicate = true;} else {elements.insert(num);}}}// 根据是否有重复元素输出结果if (hasDuplicate) {cout << "YES" << endl;} else {cout << "NO" << endl;}}return 0;
}

Python代码:
while True:# 读取行列数m, n = map(int, input().split())# 检测结束条件if m == 0 and n == 0:break# 用于存储已出现的元素elements = set()# 标记是否存在重复元素has_duplicate = False# 读取m行数据for _ in range(m):# 读取当前行的所有元素row = list(map(int, input().split()))# 检查每行的每个元素for num in row:# 若已发现重复,仅继续读取数据if has_duplicate:continue# 检查元素是否已存在if num in elements:has_duplicate = Trueelse:elements.add(num)# 输出结果print("YES" if has_duplicate else "NO")

Java代码:
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true) {// 读取行列数int m = scanner.nextInt();int n = scanner.nextInt();// 检测结束条件if (m == 0 && n == 0) {break;}// 消耗掉整数后的换行符,避免影响后续行读取scanner.nextLine();// 用于存储已出现的元素Set<Integer> elements = new HashSet<>();// 标记是否存在重复元素boolean hasDuplicate = false;// 读取m行数据for (int i = 0; i < m; i++) {// 读取当前行,分割为字符串数组String[] rowStr = scanner.nextLine().trim().split(" +");// 转换为整数并检查for (String s : rowStr) {int num = Integer.parseInt(s);// 若已发现重复,仅继续读取数据if (hasDuplicate) {continue;}// 检查元素是否已存在if (elements.contains(num)) {hasDuplicate = true;} else {elements.add(num);}}}// 输出结果System.out.println(hasDuplicate ? "YES" : "NO");}scanner.close();}
}

总结
本文描述了一个判断二维数组元素是否互不相同的算法实现。程序读取多组数据,每组包含m行n列的二维数组,使用集合(set)存储元素以检测重复。当发现重复元素时输出"YES",否则输出"NO",直到输入0 0时结束。
关键步骤:
- 循环读取m和n,检测结束条件
 - 使用集合存储元素并检测重复
 - 根据检测结果输出相应提示
 
该算法通过集合自动去重的特性高效实现了元素唯一性检查,时间复杂度为O(mn),适用于各种规模的二维数组。
