【本文由小黑盒作者@题语于08月29日发布,转载请标明出处!】
大家好呀,这里是独立游戏开发新人题语的算法小课堂。
嗯,最近呢在筹备自己的第一款独立游戏(但大部分地方都还刚刚起步,等到完成还要好久好久呢),想是提前积累积累写专栏的经验嘛。
所以呢,就从我接触比较多的算法开始啦,希望能帮助到大家啊。
之后,可能也会增加开发相关的专栏(画个大饼先hhh),也请各位大佬前辈们多多指教啊。
提前说明一下题目来源均是力扣,有兴趣的盒友也可以去看看啊。
主要本人最近也在准备408的考研,所以题解均主要使用C语言,后续也可能会添加其他语言,还望盒友们海涵。
嗯,下面我们就开始吧。今天是一道关于数组操作的简单题,两数之和。
接下来是我们需要补全的函数。
开始解题!
首先,我们观察需要补全函数的输入与输出,可以发现输入从左到右分别为 输入的整数数组nums,输入的整数数组的大小numsSize,整数目标值target,返回数组的大小returnSize;输出为返回的目标数组。
第一种方法暴力求解,双循环。
看完了函数的输入和返回值后,我们再来看题目对应的解题要求,需要找出和为目标值的两个整数。
我们可以很容易想到一种时间复杂度较高的暴力求解方法,就是将输入的整数数组中每种元素的组合都逐一都列出,直至找到和为目标值的组合后,返回组合数组。
根据以上思想,我们就可以构建出整体代码。
首先,申请我们需要返回的数组的空间
然后,因为需要找出整数数组中每种元素的组合,我们可以构建一个双循环的结构
为什么j需要等于i + 1呢?主要呢是为了防止组合出现重复以及组合中的元素出现重复。
好了,我们已经成功找到了所有的组合。接下来,我们就应该来书写判断条件啦,就是我们需要去思考什么时候返回我们正确的组合,以及停止函数的运行。
这时候呢我们就可以在双循环中加入判断条件,如果两个整数的和为目标值时,就对数组进行赋值,并返回,否则继续循环
现在,我们已经完成大部分代码了,加油,还差一点儿。我们的代码是不是还少了些什么?如果在两个循环结束时都没有找到和为目标值的两个整数,那么我们这个函数是不是就会出错,因为这时候该函数没有返回值了。
所以呢为了解决这个问题,我们就可以在函数的末尾加入返回值,一个是表明返回0个整数的整形指针,一个是NULL代表没有返回值,也就是没有找到目标组合
最终代码如下
因为在该算法中需要进行双重循环遍历,所以时间复杂度为O(n^2),又因为该代码运行过程中所需的额外存储空间是固定的,与输入数据的规模无关,所以空间复杂度为O(1)。
在 C 语言中,指针的算术运算(如 + -)是基于指针所指向的数据类型大小的,而不是直接操作字节数。
接下来呢,还存在第二种方法。
就是以空间换时间,建立哈希表,将已经遍历的元素存入,后续遍历的元素到哈希表中寻找是否存在匹配的元素,若存在返回,若不存在也存入哈希表后继续遍历,直置有返回或遍历结束。
第二种因为需要应用到哈希表,会在后序的题目中进行详细的讲解,故在此便不展开哩。
使用该方法的时间空间复杂度均为O(n)。
好了,这道题目就到此结束啦,有什么问题和疑问呢欢迎热心的盒友们提出啊。