c语言二分法查找一个数_C语言系列 --- 求取两数之和

e42408b91dd11ee398988478af723d34.png

给定一个数组nums和一个目标值target,请你在数组中找到和为目标值的那两个整数,并且返回他们的数组下标?

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中的同样的元素。

示例:

给定nums = [2,7,11,15],target = 9因为nums[0] + nums[1] = 2 + 7 = 9所以返回[0,1]

如果不考虑时间效率的问题,我们可以考虑暴力破解的方法来解决这道问题;如果需要提高效率我们就需要采用hash表来加快处理的速度,但是C语言中并不像C++那样存在系统的hash函数,这就需要我们自己编写一个hash结构来实现。

总而言之,我们现在有两种方法来解决这道问题,其一,暴力破解法;其二,hash表法;

一、暴力破解法

暴力法采用双重for循环,判断素组中是否存在一个值与target-当前元素相等的目标元素。

具体实现思路如下:

1、用第一个数与第二个至第n个数分别进行加起来,判断是否等于目标值target,如果等于,则找到这两个数据,并记录下标;

2、如果没有找到,则用第二个数与第三个至第n个数分别进行加起来,判断是否等于目标值target,如果等于,则找到这两个数据,并记录下标;

以此类推;

具体实现如下:

0062a50092cf41667477875ed3ea445e.png

暴力破解的算法实现

2e4d7876db0660055e47aba3e5e67c74.png

算法测试

3、测试结果

08f221ca6fa7bd1c80ca171990c180d2.png

测试实例中,需要测试target = 22时,两个数的下标,测试样例[2,7,11,15],刚好,5 + 15 = 22,所以得到的下标为[1,3]。

二、hash表法

hash法可以一边插入哈希表,一边进行查找。

因为是两数之和,所以我们插入的是当前遍历时输入数组的下标对应的信息,需要查找的是target - nums[i]这个数据是否在表中。

hash法需要建立hash表的数据结构,以及hash表的初始化、hash表的插入、hash表的查找、计算hash值以及内存释放;

具体实现如下:

1、建立hash表

建立hash表的元素索引以及hash表结构体

61420d3fc35a4e034d50011b29ac8dd2.png

2、初始化hash表

对hash结构体里面的元素进行初始化

1d656b849a07f5de6f9bff1bad969869.png

3、释放hash表的内存空间

对创建的指针所占用的空间进行释放,防止内存泄漏

e6e6463ef61136507e208ca7f5ddea38.png

4、计算hash值

用开放地址法来计算hash数据的在hash表中的位置

16c6ac649c09437f319f46199a10e8ac.png

5、插入hash表

向hash表中插入计算之后的数据

fd195e7752bbc5e6735a6c8486c1f349.png

6、查找hash表

4ffaf4027d016c182a904df54ca8249e.png

7、计算两个数的和

8dcb48cd0f04041d642b839670dde40f.png
fd58b012db7b55ba3eaba6b8aa54a9df.png

8、测试函数

d125d9fbcf7af3721461d9da95a8424a.png

9、测试结果

20fe87cc73476d10d085193b0a32a1a0.png

测试实例中,需要测试target = 9时,两个数的下标,测试样例[2,7,11,15],刚好,2 + 7 = 9,所以得到的下标为[0,1]。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值