2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 判断一个数组是否是另一个数组的子集

判断一个数组是否是另一个数组的子集

时间:2020-11-06 05:23:52

相关推荐

判断一个数组是否是另一个数组的子集

给两个数组:arr1[0..m-1] 和arr2[0..n-1]. 判断arr2是否是arr1的一个子集合,两个数组都是未排序的。

例子:

Input: arr1[] = {11, 1, 13, 21, 3, 7}, arr2[] = {11, 3, 7, 1}

Output: arr2[] is a subset of arr1[]

Input: arr1[] = {1, 2, 3, 4, 5, 6}, arr2[] = {1, 2, 4}

Output: arr2[] is a subset of arr1[]

Input: arr1[] = {10, 5, 2, 23, 19}, arr2[] = {19, 5, 3}

Output: arr2[] is not a subset of arr1[]

1、简单方法就是双重遍历

判断arr2矩阵中的所有元素是不是在arr1

#include<stdio.h>bool isSubset(int arr1[], int arr2[], int m, int n){int i = 0;int j = 0;for (i=0; i<n; i++){for (j = 0; j<m; j++){if(arr2[i] == arr1[j])break;}if (j == m)return 0;}return 1;}int main(){int arr1[] = {11, 1, 13, 21, 3, 7};int arr2[] = {11, 3, 7, 1};int m = sizeof(arr1)/sizeof(arr1[0]);int n = sizeof(arr2)/sizeof(arr2[0]);if(isSubset(arr1, arr2, m, n))printf("arr2[] is subset of arr1[] ");elseprintf("arr2[] is not a subset of arr1[]");return 0;}

但是对于重复的元素方法好像不行,例如{1, 4, 4, 2} 并不是 {1, 4, 2}的子集

bool isSubset(int arr1[], int arr2[], int m, int n){int i = 0, j = 0;if(m < n)return 0;quickSort(arr1, 0, m-1);quickSort(arr2, 0, n-1);while( i < n && j < m ){if( arr1[j] <arr2[i] )j++;else if( arr1[j] == arr2[i] ){j++;i++;}else if( arr1[j] > arr2[i] )return 0;}if( i < n )return 0;elsereturn 1;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。