在这个问题中,我们给了两个大小分别为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