在这个问题中,我们给了两个大小分别为n和n + 1的排序数组arr1和arr2,除多余元素外,所有元素都相同。我们的任务是找到存在于一个排序数组中的额外元素的索引。
问题描述: 我们需要从大小为n + 1的数组中找到n + 1大小的元素的索引。
输入: arr1 [n] = {
3、5、7、8、9、12 } arr2 [n + 1] = {3、4、5、7、8、9、12}
输出 1
解释:
值为4的元素多余,位于索引1处。
解决该问题的一种简单方法是使用两个数组都已排序的事实。并且只有一个不相等的元素,我们可以执行线性搜索并在arr2中找到arr1 []中不存在的元素。
算法:
步骤1: 为i循环-> 0到n + 1,
步骤1.1: 找到奇数元素,如果arr1 [i]!= arr2 [i],则中断循环。
步骤2:传 回i的值。
#include <iostream> using namespace std; int findExtraElement(int arr1[], int arr2[], int n) { int i; for (i = 0; i < n; i++) if (arr1[i] != arr2[i]) break; return i; } int main() { int arr1[] = {3, 5, 7, 8, 9, 12}; int arr2[] = {3, 4, 5, 7, 8, 9, 12}; int n = sizeof(arr1) / sizeof(arr1[0]); int extraIndex = findExtraElement(arr1, arr2, n); cout<<"The extra element is at index ("<<extraIndex<<") and the value is "<<arr2[extraIndex]; return 0; }输出结果
The extra element is at index (1) and the value is 4
通过使用更有效的搜索技术(二进制搜索 而不是线性减少算法的计算时间),可以更好地解决此问题:
#include <iostream> using namespace std; int findExtraElement(int arr1[], int arr2[], int n) { int extraIndex = n; int start = 0, end = n - 1; while (start <= end) { int mid = (start + end) / 2; if (arr2[mid] == arr1[mid]) start = mid + 1; else { extraIndex = mid; end = mid - 1; } } return extraIndex; } int main() { int arr1[] = {3, 5, 7, 8, 9, 12}; int arr2[] = {3, 4, 5, 7, 8, 9, 12}; int n = sizeof(arr1) / sizeof(arr1[0]); int extraIndex = findExtraElement(arr1, arr2, n); cout<<"The extra element is at index ("<<extraIndex<<") and the value is "<<arr2[extraIndex]; return 0; }输出结果
The extra element is at index (1) and the value is 4
另一种方法:
解决该问题的另一种方法是找到两个数组之间的绝对差,这是额外的元素。然后,我们需要在大小为n + 1的数组中找到此额外元素的索引。这可以使用搜索算法来完成。
#include <iostream> using namespace std; int calcArraysum(int arr[], int n){ int sum = 0; for(int i = 0; i < n; i++) sum += arr[i]; return sum; } int findExtraElement(int arr1[], int arr2[], int n) { int extraValue = calcArraysum(arr2, n+1) - calcArraysum(arr1, n); for (int i = 0; i < n; i++) { if (arr2[i] == extraValue) return i; } return -1; } int main() { int arr1[] = {3, 5, 7, 8, 9, 12}; int arr2[] = {3, 4, 5, 7, 8, 9, 12}; int n = sizeof(arr1) / sizeof(arr1[0]); int extraIndex = findExtraElement(arr1, arr2, n); cout<<"The extra element is at index ("<<extraIndex<<") and the value is "<<arr2[extraIndex]; return 0; }输出结果
The extra element is at index (1) and the value is 4