双重数组在解决问题中的使用

一、双重数组的简单解释

双重数组,意思很简单,也就是两个数组一起使用。

因为最近做的一些题目当中用到这一思想的题目有很多,所以想要总结一下,内容粗糙、简略。

二、题目

当我们遇到一些需要记录次数或者是序号的时候,使用双重数组一般是比较简单的。

当然,在一些特殊算法当中,也会有双重数组的使用,这里展示不提。

下面举几个例子:

(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(" ");
    }
}

利用到这种思想的题目有很多,这里因为时间关系只写两道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值