给定一个数组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,如果等于,则找到这两个数据,并记录下标;
以此类推;
具体实现如下:
3、测试结果
测试实例中,需要测试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表结构体
2、初始化hash表
对hash结构体里面的元素进行初始化
3、释放hash表的内存空间
对创建的指针所占用的空间进行释放,防止内存泄漏
4、计算hash值
用开放地址法来计算hash数据的在hash表中的位置
5、插入hash表
向hash表中插入计算之后的数据
6、查找hash表
7、计算两个数的和
8、测试函数
9、测试结果
测试实例中,需要测试target = 9时,两个数的下标,测试样例[2,7,11,15],刚好,2 + 7 = 9,所以得到的下标为[0,1]。