我写的代码复杂度为o(n ^ 2)。我找不到错误。我的想法是先对数组进行排序,然后再从第一个元素开始,如果第二个下一个是i等于2递增,当如果条件不满足则找到元素有人可以帮我这个忙。 预先感谢
#include<iostream>
using namespace std;
int main()
{
int arr[100];
int n,i,j,temp;
cin>>n;
for(i=0;i<n;i++)
{
cin>>arr[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(arr[i]>arr[j])
{
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
i=0;
for(j=i+1;j<n;j++)
{
if(arr[i] == arr[j])
{
i=i+2;
}
}
cout<<arr[i];
return 0;
}
答案 0 :(得分:2)
要在数组中查找非重复元素,首先想到的是,如果我们先对数组进行排序然后尝试对其进行操作。排序过程很简单,如下所示:
int arr[] = {/*Some array*/};
int arrSize = sizeof(arr)/sizeof(int);
//Lets sort the array
for(int i=0;i<arrSize;i++)
{
for(int j=i;j<arrSize;j++)
{
if(arr[i]>arr[j])
{
int t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
}
对数组进行排序后,我们可能会看到不同的情况,例如:
int arr1[] = {1,1,2,2,3};
int arr2[] = {1,2,2,3,3};
int arr3[] = {1,1,2,3,3};
我们必须设计一种算法,使其能够区分并轻松操纵这三种情况。设n为我们的数字。第一种情况是通过以下方法检查最后一个与上一个是否不同:
if(arr[arrSize-1] != arr[arrSize-2]) //The last is not the same as the previous
{
n=arr[arrSize-1];
}
第二个类似于第一个:
if(arr[0] != arr[1]) // The first element is not the same as the second
{
n = arr[0];
}
第三个也很容易,我们只需要检查两个邻居是否永远不等于中间数,就可以了:
for(int i=1;i<arrSize-1;i++)
{
if(arr[i-1] != arr[i] && arr[i] != arr[i+1])
{
n=arr[i];
break;
}
}
因此完整的代码将变为:
#include <iostream>
using namespace std;
int main()
{
int arr[] = {1,2,3,4,2,3,1};
int arrSize = sizeof(arr)/sizeof(int);
//Lets sort the array
for(int i=0;i<arrSize;i++)
{
for(int j=i;j<arrSize;j++)
{
if(arr[i]>arr[j])
{
int t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
}
int n;
if(arr[0] != arr[1]) // The first element is not the same as the second
{
n = arr[0];
}
else if(arr[arrSize-1] != arr[arrSize-2]) //The last is not the same as the previous
{
n=arr[arrSize-1];
}
else //Lets search for a number such that its not the same as the numbers on the left and on the right
{
for(int i=1;i<arrSize-1;i++)
{
if(arr[i-1] != arr[i] && arr[i] != arr[i+1])
{
n=arr[i];
break;
}
}
}
cout << n;
}
第二种方式(更好的一种)。
这是我们可以解决此问题的另一种方法。假设我有一个数字n = 3,如果我将它与3进行异或运算,我将得到0,所以如果我们有一个数组,假设arr [] = {1,2,1},我首先分配n = 0,然后进行异或它与firs元素(1)进行交互,接下来对I与第二个元素进行异或,然后对第三个元素进行异或。会发生什么?第三个XOR将抵消第一个XOR的影响,因此n等于1。示例代码:
#include <iostream>
using namespace std;
int main()
{
int arr[] = {1,2,3,4,2,3,1};
int arrSize = sizeof(arr)/sizeof(int);
int n=0;
for(int i=0;i<arrSize;i++)
{
n^=arr[i];
}
cout << n;
}
此代码为O(n)。