一、双重数组的简单解释
双重数组,意思很简单,也就是两个数组一起使用。
因为最近做的一些题目当中用到这一思想的题目有很多,所以想要总结一下,内容粗糙、简略。
二、题目
当我们遇到一些需要记录次数或者是序号的时候,使用双重数组一般是比较简单的。
当然,在一些特殊算法当中,也会有双重数组的使用,这里展示不提。
下面举几个例子:
(1)记录出现次数:
题:
要求输入一组数据(数据总数不超过10000,各个数据在0到1000之间),输出这组数据当中的众数(也就是出现次数最多的数)。
我们一般的想法可能是利用一个数组来进行存储这一组数据,然后令一个变量来暂存它的数组下标或者出现次数。但这很显然是很难实现的或者说比较复杂。但是如果我们使用双重数组,用另一个数组来存放输入数据的出现次数,同时注意一下这个数组的下标与输入数据之间的关系,那么就可以很简单的实现这一问题。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, arr1[1100], arr2[1100] = {0};
cin >> n;
int i, temp, max = 0;
for (i = 0; i < n; i++)
{
cin >> arr1[i]; // 输入数组元素
arr2[arr1[i]]++; // 记录数组中传入数据出现的次数,注意下标表示
}
int t;
for (i = 0; i < n; i++)
{
for (t = 0; t < n - i; t++)
{
if (max < arr2[t])
{
max = arr2[t];//存一下最大值,以便于比较
temp = t;
}
}
}
cout << temp << endl;
return 0;
}
当然,这个题不一定非要用这种方法,当不需要你保存输入的数据时,完全可以用一个数组来做:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int a[1001] = { 0 };//创建一个数组存放输入的数据
int i;
int k;
int s;
for (i = 0; i < n; i++)
{
scanf("%d", &k);//这里是我们输入的数据,但并没有保存
a[k]++;//数组精确的把你输入的数字作为下标并在这个元素上加一,记录出现次数
}
int max = 0, b;
for (b = 0; b <= 1000; b++)
{
if (max < a[b])
{
max = a[b];
s = b;
}
}
printf("%d\n", s);
return 0;
}
(2)数组排序问题(需要实现排序,并且需要输出原数据的输入顺序)
题:
要求输入一组数据(数据个数固定为10,要求升序输出,并且输出升序输出后各数据在输入时的顺序)
这种问题就必须使用双重数组了,但是用双重数组也有很多种用法,这里只讲存放序号的一种方法。
#include<stdio.h>
int main()
{
int arr[15],b[15];
int i,t,temp;
for(i=1;i<=10;i++)
{
scanf("%d",&arr[i]);
b[i]=i;
}
for(i=1;i<=9;i++)
{
for(t=1;t<=10-i;t++)
{
if(arr[t]>arr[t+1])
{
temp=arr[t];
arr[t]=arr[t+1];
arr[t+1]=temp;
temp=b[t];
b[t]=b[t+1];
b[t+1]=temp;
}
}
}
for(i=1;i<=10;i++)
{
printf("%d",arr[i]);
if(i<10)
printf(" ");
}
printf("\n");
for(i=1;i<=10;i++)
{
printf("%d",b[i]);
if(i<10)
printf(" ");
}
}
利用到这种思想的题目有很多,这里因为时间关系只写两道。