给定一个含有n个整数的数组A和一个整数x,
该算法判断A中是否存在有两个和等于x的元素。
8 个解决方案
#1
如果数组A 不是已经排序好的话貌似没有 O(n)的算法
排序好了的话就首位双指针查
排序好了的话就首位双指针查
#2
Hash就可以了
#3
做个标记,
#4
无序的话不行吧
#5
贴上自己写的一段代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int _g_array[] = {1,2,3,4,5,6,7,8,9,10};
bool func(int _array[],int _length,int _x)
{
bool _ret = false;
int *_pt_tmp = (int *)malloc(_x*sizeof(int));
if ( !_pt_tmp )
return _ret;
memset(_pt_tmp,0,sizeof(_x*sizeof(int)));
for ( int i = 0;i < _length;++i )
_pt_tmp[_array[i]%_x] += 1;
if ( _pt_tmp[0] >= 2 )
_ret = true;
else if ( _x%2 == 0 )
{
if ( _pt_tmp[(_x+1)/2] >= 2 )
_ret = true;
}
else
{
for ( int i = 1;i < (_x + 1)/2;++i )
{
int j = _x - i;
if ( _pt_tmp[i] && _pt_tmp[j] )
{
_ret = true;
break;
}
}
}
free(_pt_tmp);
return _ret;
}
int main()
{
printf("%d\r\n",func(_g_array,10,19));
getchar();
return 0;
}
#6
hash=x-A[i],不过一般的hash(比如取余)还不如排序
#7
代码写的好专业啊
#8
就是,我瞬间以为看见了库函数
#1
如果数组A 不是已经排序好的话貌似没有 O(n)的算法
排序好了的话就首位双指针查
排序好了的话就首位双指针查
#2
Hash就可以了
#3
做个标记,
#4
无序的话不行吧
#5
贴上自己写的一段代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int _g_array[] = {1,2,3,4,5,6,7,8,9,10};
bool func(int _array[],int _length,int _x)
{
bool _ret = false;
int *_pt_tmp = (int *)malloc(_x*sizeof(int));
if ( !_pt_tmp )
return _ret;
memset(_pt_tmp,0,sizeof(_x*sizeof(int)));
for ( int i = 0;i < _length;++i )
_pt_tmp[_array[i]%_x] += 1;
if ( _pt_tmp[0] >= 2 )
_ret = true;
else if ( _x%2 == 0 )
{
if ( _pt_tmp[(_x+1)/2] >= 2 )
_ret = true;
}
else
{
for ( int i = 1;i < (_x + 1)/2;++i )
{
int j = _x - i;
if ( _pt_tmp[i] && _pt_tmp[j] )
{
_ret = true;
break;
}
}
}
free(_pt_tmp);
return _ret;
}
int main()
{
printf("%d\r\n",func(_g_array,10,19));
getchar();
return 0;
}
#6
hash=x-A[i],不过一般的hash(比如取余)还不如排序
#7
代码写的好专业啊
#8
就是,我瞬间以为看见了库函数