給定兩個整數陣列,判斷是否存在至少一個相同元素。這是雙重迴圈搜尋的經典應用,也是理解時間複雜度 O(n×m) 的入門案例。
#include <stdio.h>
#include <stdbool.h> // C99 布林型別
bool arrays_have_common(const int *arr1, size_t len1,
const int *arr2, size_t len2) {
for (size_t i = 0; i < len1; i++) {
for (size_t j = 0; j < len2; j++) {
if (arr1[i] == arr2[j]) {
return true; // 找到即返回
}
}
}
return false;
}
int main() {
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 7, 4, 9};
size_t len1 = sizeof(arr1) / sizeof(arr1[0]);
size_t len2 = sizeof(arr2) / sizeof(arr2[0]);
if (arrays_have_common(arr1, len1, arr2, len2)) {
puts("存在相同元素");
} else {
puts("無相同元素");
}
return 0;
}
// 原始碼錯誤:
for (i = 0; i < sizeof(arr1)/sizeof(arr1[0]); i++) {
for (j = 0; j < sizeof(arr2)/sizeof(arr2[0]); j++) {
if (arr1[i] == arr2[j]) {
printf("存在相同元素");
break; // 只跳出內層迴圈
}
}
break; // 錯誤:外層迴圈也 break,導致只檢查 arr1[0]!
}
修正:移除外層 break,或使用函數提前 return,或設置標誌變量。
| 方法 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 雙重迴圈 | O(n×m) | O(1) | 小陣列、無序、不可修改 |
| 排序 + 雙指針 | O(n log n + m log m) | O(1) 或 O(n+m) | 中大型陣列、可修改 |
| 哈希表/位圖 | O(n+m) | O(n) | 大陣列、頻繁查詢、數值範圍小 |