您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 新余分类信息网,免费分类信息发布

两个数的和

2023/10/27 7:06:38发布25次查看
两个数的和
给定一个整数数组nums和一个目标值target,请找出两个整数的和是数组中的目标值,并返回它们的数组下标。
您可以假设每个输入只对应一个答案。但是,数组中的同一个元素不能使用两次。
示例:
给定nums = [2,7,11,15],目标= 9
返回[0,1],因为nums[0]+nums[1] = 2+7 = 9
来源eetcode link:/problems/two-sum的版权属于灵口网络。商业转载请联系官方授权,非商业转载请注明来源。
关于这个问题,我们可以通过简单的遍历来解决。
使用第一次遍历取出一个数字,用target减去这个数字得到另一个数字,然后将这个数字与数组中的其他数字进行比较。如果它们相等,这两个数字的下标将被写入数组并显示出来。核心代码如下:
int*二进制数(int* nums,int numssize,int target,int* returnsize){ int i,j,response _ sub = 0;int m_size=3,*结果= malloc(m _ size * sizeof(int));对于(i = 0;i&lt。numssizei++) {对于(j = 0;j&lt。i .j ++ if(nums[i次元世界突破之乐园王者最新章节]+nums[j]= = target){ result[answer _ sub++]= i;结果[答案_ sub ++]= j;m _ size+= 2;result=realloc(result,m _ size * sizeof(int));} } * returnsize =答案_ sub返回结果;{}
然而,该算法的时间复杂度在0(n的平方)数量级,但是复杂度在空之间相对较好。
测试结果需要在更快的运行速度方面降低时间复杂度。开始时,我想先用二进制排序模式对两个整数进行分类,一个大于taget/2,一个小于taget/2。想一想,这不是先排序,然后循环的次数会少得多。分类越准确,之后的循环次数就越少。然而,排序算法花费了大量时间,这是不值得的。在那之后,我突然想到,如果我们建立一个索引,比如一个二叉树,我们可能在一次遍历后知道结果。但事实上,它不可能有一个简单快速的哈希表。
下面是我用哈希表创建的代码:
#包括&lt。stdio.h&gt。#包括&lt。stdlib.h&gt。typedef结构hal { int dataint sub结构hal *下一步;} halint elf(int data){ data =(data+2)* 3;如果(数据&lt。0)数据=-数据;返回数据% 256;} void init _ hash(hal * hal){ int i;对于(i = 0;i&lt。256;i++) { hal。数据= 0;哈尔[我]。sub =-1;哈尔[我]。next =(void *)0;} }无效add_hash(hal *hal,int data,int sub){ hal * hal _ single;hal _ single = & amphal[elf(数据)];对于(;hal_single->潜艇。=-1;){ if(hal_single->;数据= =数据){返回;}否则{ hal_single=hal_single-&gt。下一个;} } hal_single-&gt。下一个=(hal *)malloc(sizeof(hal));hal_single->下一个-&gt。sub =-1;hal_single->数据=数据;hal_single->next =(void *)0;hal_single->sub=sub。}int find_hash_sub(hal *hal,int data){ hal * hal _ single;hal _ single = & amphal[elf(数据)];对于(;hal_single->潜艇。=-1;){ if(hal_single->;data = = data){ return hal _ single-& gt。sub}否则{ hal_single=hal_single-&gt。下一个;} }返回-1;} void free _ hash(hal * hal){ int i;hal *single_hal,*下一个;对于(i = 0;i&lt。256;i++){ for(single _ hal = & amp;hal[i];单哈尔。){ next=single_hal-&gt。下一个;免费(单半);single _ hal = next} }}int*二进制(int* nums,int numssize,int target,int * returnsize){ hal hal[256];init _ hash(hal);int m_size=3,* result =(int *)malloc(m _ size * sizeof(int)),response _ sub = 0;int rest_value,rest _ subint i;对于(i = 0;i&lt。numssizei++) { rest _ value = target-nums[i];rest_sub=find_hash_sub(hal,rest _ value);if(rest_sub!=-1) {结果[答案_ sub ++]= i;结果[答案_ sub ++]= rest _ sub;m _ size+= 2;result=(int *)realloc(result,m _ size * sizeof(int));}否则{ add_hash(hal,nums,i);} } * returnsize =答案_ sub自由散列(hal);返回结果;}int main(){ int a[2]={2222222,2222222 };int ret,* resres=二进制(a,2,4444444 & amp。ret);int i;对于(i = 0;i&lt。ret。i++){ printf(& # 34;% d & # 34,res[i]);}免费(res);{}
结果令人满意:
哈希表测试结果
文章来源:www.atolchina.com
新余分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录