leetcode 2657.找到两个数组的前缀公共数组

1.题目要求:

给你两个下标从 0 开始长度为 n 的整数排列 A 和 B 。

A 和 B 的 前缀公共数组 定义为数组 C ,其中 C[i] 是数组 A 和 B 到下标为 i 之前公共元素的数目。

请你返回 A 和 B 的 前缀公共数组 。

如果一个长度为 n 的数组包含 1 到 n 的元素恰好一次,我们称这个数组是一个长度为 n 的 排列 。

 

示例 1:

输入:A = [1,3,2,4], B = [3,1,2,4]
输出:[0,2,3,4]
解释:i = 0:没有公共元素,所以 C[0] = 0 。
i = 113 是两个数组的前缀公共元素,所以 C[1] = 2 。
i = 2123 是两个数组的前缀公共元素,所以 C[2] = 3 。
i = 31234 是两个数组的前缀公共元素,所以 C[3] = 4 。
示例 2:

输入:A = [2,3,1], B = [3,1,2]
输出:[0,1,3]
解释:i = 0:没有公共元素,所以 C[0] = 0 。
i = 1:只有 3 是公共元素,所以 C[1] = 1 。
i = 2123 是两个数组的前缀公共元素,所以 C[2] = 3 。
 

提示:

1 <= A.length == B.length == n <= 50
1 <= A[i], B[i] <= n
题目保证 A 和 B 两个数组都是 n 个元素的排列。

2.题目代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int judge(int* A,int* B,int i){
    int j = 0;
    int count = 0;
    int* number = (int*)malloc(sizeof(int) * 51);
    //判断有几个公共数,用哈希表
    memset(number,0,sizeof(int) * 51);
    for(j = 0;j <= i;j++){
        int index = A[j] - 1;
        number[index] = A[j];
    }
    for(j = 0;j <= i;j++){
        int index = B[j] - 1;
        if(number[index] != 0){
            count++;
        }
    }
    return count;
}
int* findThePrefixCommonArray(int* A, int ASize, int* B, int BSize, int* returnSize){
    int* C = (int*)malloc(sizeof(int) * ASize);//创建前缀数组
    int j = 0;
    for(int i = 0;i < ASize;i++){
        int ret = judge(A,B,i);
        C[j] = ret;
        j++;
    }
    *returnSize = ASize;
    return C;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值