判斷一個數組是否為另一個數組的子集 - 在 C++ 中添加了方法 3


在這個問題中,我們給定兩個整數陣列 arr1[] 和 arr2[],大小分別為 m 和 n。我們的任務是判斷一個數組是否為另一個數組的子集 - 添加了方法 3

兩個陣列 arr1[] 和 arr2[] 都是無序的,並且具有不同的元素。

讓我們舉個例子來理解這個問題,

Input : arr1[] = {5, 2, 1, 6, 8, 10}, arr2[] = {6, 2, 1}
Output : arr2 is a subset of arr1.

解決方案方法

為了解決這個問題,我們在這裡討論了多種方法。讓我們看看每種方法的工作原理以及程式。

方法 1

解決此問題的一種方法是直接檢查子集。這是使用巢狀迴圈完成的,外部迴圈遍歷陣列 arr2[] 的每個元素,內部迴圈遍歷陣列 arr1[] 的每個元素。我們將檢查 arr2 的每個元素是否出現在 arr1 中,如果出現則返回 1(arr2 是 arr1 的子陣列),否則返回 0(arr2 不是 arr1 的子陣列)。

示例

程式說明我們解決方案的工作原理

#include <iostream>
using namespace std;
bool isSubsetArray(int arr1[], int arr2[], int m, int n){
   int j = 0;
   for (int i = 0; i < n; i++) {
      for (j = 0; j < m; j++) {
         if (arr2[i] == arr1[j])
            break;
      }
      if (j == m)
         return false;
   }
   return true;
}
int main(){
   int arr1[] = {5, 2, 1, 6, 8, 10};
   int arr2[] = {6, 2, 1};
   int m = sizeof(arr1) / sizeof(arr1[0]);
   int n = sizeof(arr2) / sizeof(arr2[0]);
   isSubsetArray(arr1, arr2, m, n)? cout<<"arr2[] is subset of arr1[] ": cout<<"arr2[] is not a  subset of arr1[]";
   return 0;
}

輸出

arr2[] is subset of arr1[]

方法 2

解決此問題的另一種方法是檢查 arr2 的所有元素是否都存在於 arr1 中。為了有效地做到這一點,我們將對陣列 arr1[] 進行排序,然後對 arr2 的每個元素執行二分查詢以在 arr1[] 中搜索 arr2[] 的元素。現在,如果找不到任何元素,則返回 0(arr2 不是 arr1 的子陣列),如果 arr2 的所有元素都存在於 arr1 中,則返回 1(arr2 是 arr1 的子陣列)。

示例

程式說明我們解決方案的工作原理

#include <bits/stdc++.h>
using namespace std;
int binarySearch(int arr[], int low, int high, int x){
   if (high >= low){
      int mid = (low + high) / 2;
      if ((mid == 0 || x > arr[mid - 1]) && (arr[mid] == x))
         return mid;
      else if (x > arr[mid])
         return binarySearch(arr, (mid + 1), high, x);
      else
         return binarySearch(arr, low, (mid - 1), x);
   }
   return -1;
}
bool isSubsetArray(int arr1[], int arr2[], int m, int n){
   int i = 0;
   sort(arr1, arr1 + m);
   for (i = 0; i < n; i++) {
      if (binarySearch(arr1, 0, m - 1, arr2[i]) == -1)
         return 0;
   }
   return 1;
}
int main(){
   int arr1[] = {5, 2, 1, 6, 8, 10};
   int arr2[] = {6, 2, 1};
   int m = sizeof(arr1) / sizeof(arr1[0]);
   int n = sizeof(arr2) / sizeof(arr2[0]);
   isSubsetArray(arr1, arr2, m, n)? cout<<"arr2[] is subset of arr1[] ": cout<<"arr2[] is not a subset of arr1[]";
   return 0;
}

輸出

arr2[] is subset of arr1[]

方法 3

另一種查詢解決方案的方法是首先對兩個陣列 arr1[] 和 arr2[] 進行排序。然後,對於陣列 arr2[] 的所有元素,檢查它們是否存在於 arr1[] 中。為此,我們有一種直接的方法,即使用兩個陣列中元素的索引。

示例

程式說明我們解決方案的工作原理

#include <bits/stdc++.h>
using namespace std;
bool isSubsetArray(int arr1[], int arr2[], int m, int n){
   int i = 0, j = 0;
   if (m < n)
      return 0;
   sort(arr1, arr1 + m);
   sort(arr2, arr2 + n);
   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;
   }
   return (i < n) ? false : true;
}
int main()
{
   int arr1[] = {5, 2, 1, 6, 8, 10};
   int arr2[] = {6, 2, 1};
   int m = sizeof(arr1) / sizeof(arr1[0]);
   int n = sizeof(arr2) / sizeof(arr2[0]);
   isSubsetArray(arr1, arr2, m, n)? cout<<"arr2[] is subset of arr1[] ": cout<<"arr2[] is not a subset of arr1[]";
   return 0;
}

輸出

arr2[] is subset of arr1[]

方法 4

另一種方法,檢查 arr2 是否是 arr1 的子集,是使用雜湊。我們將使用 arr1 的所有元素建立一個雜湊表,然後在雜湊表中搜索 arr2 的元素。如果找到值,則返回 1(arr2 是 arr1 的子集),否則返回 0(arr2 不是 arr1 的子集)。

示例

程式說明我們解決方案的工作原理

#include <bits/stdc++.h>
using namespace std;
bool isSubsetArray(int arr1[], int arr2[], int m, int n){
   set<int> arr1Hash;
   for (int i = 0; i < m; i++)
      arr1Hash.insert(arr1[i]);
   for (int i = 0; i < n; i++) {
      if (arr1Hash.find(arr2[i]) == arr1Hash.end())
         return false;
   }
   return true;
}
int main(){
   int arr1[] = {5, 2, 1, 6, 8, 10};
   int arr2[] = {6, 2, 1};
   int m = sizeof(arr1) / sizeof(arr1[0]);
   int n = sizeof(arr2) / sizeof(arr2[0]);
   isSubsetArray(arr1, arr2, m, n)? cout<<"arr2[] is subset of arr1[] ": cout<<"arr2[] is not a subset of arr1[]";
   return 0;
}

輸出

arr2[] is subset of arr1[]

方法 5

解決此問題的另一種方法是使用集合資料結構。我們將使用 arr1 的所有值建立一個新的集合並檢查其長度。然後,我們將嘗試插入 arr2 的所有值,如果新增會更改長度,則 arr2 不是 arr1 的子集。如果新增 arr2 的元素後長度沒有發生變化,則 arr2 是 arr1 的子集。

示例

程式說明我們解決方案的工作原理

#include <bits/stdc++.h>
using namespace std;
bool isSubsetArray(int arr1[], int arr2[], int m, int n){
   unordered_set<int> arrSet;
   for (int i = 0; i < m; i++) {
      arrSet.insert(arr1[i]);
   }
   int setSize = arrSet.size();
   for (int i = 0; i < n; i++) {
      arrSet.insert(arr2[i]);
   }
   if (arrSet.size() == setSize) {
      return true;
   }
   else {
      return false;
   }
}
int main(){
   int arr1[] = {5, 2, 1, 6, 8, 10};
   int arr2[] = {6, 2, 1};
   int m = sizeof(arr1) / sizeof(arr1[0]);
   int n = sizeof(arr2) / sizeof(arr2[0]);
   isSubsetArray(arr1, arr2, m, n)? cout<<"arr2[] is subset of arr1[] ": cout<<"arr2[] is not a subset of arr1[]";
   return 0;
}

輸出

arr2[] is subset of arr1[]

更新於: 2022 年 2 月 1 日

318 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.