力扣刷题第一弹之《两数之和》

力扣刷题第一弹之《两数之和》

力扣,名字来源为LeetCode的音译,意思是我们一起来编程吧。这是一个全球极客挚爱的高质量技术成长平台,里面有超过1450道题目资源以及相关公司的面试真题、其中包括腾讯、阿里、百度、美团、字节跳动等公司的笔试真题。

​话不多说,我们直奔主题。

问题

McAt78.png

​    从题目给的难度来说是属于简单难度,看了下题目确实如此,题目描述的就是给你一个数组和目标值,然后你要从数组里找到两个整数之和等于目标整数,最终返回这两个整数在数组中的下标。题目给的实例也说的很清楚,而且特别要注意的是题目上说明了“你可以假设每种输入只会对应一个答案,但是你不能够重复利用这个数组中同样的元素”,也就是说最后只会有一个答案。

​    看完之后只要稍微有点编程基础的人都会做这道题目,其实就是利用两层循环从而两数相加判断相加之和是否等于target,如果等于target直接跳出循环。

解题

​    思路有了我们就开始编写代码吧,由于笔者报名了第十一届蓝桥杯比赛的c/c++组,所以我们就选择用c语言来解决这道LeetCode中的第一道简单题。选择c之后出现的界面是这样的:
McV8df.png

​    也就是说让我们写个函数,然后他们的测试程序会按照格式来调用我们写的函数从而和结果相比对,比对一致则判断通过。看了看这个函数的参数,第一个参数不用说就是传入的数组,第二个参数从字面意思上来说就是数组的长度,第三个参数就是我们的目标值,也就是让我们在数组里找到两个数相加之和等于这个目标数,最后一个参数,注意了,笔者在最简单的题目上栽了跟头,就是因为这最后一个参数。笔者最开始眼睛一扫,觉得最后一个参数就是我们返回的用来存储数组下标的数组,但是这个想法是错误的,从字面上意思来理解的话是返回的那个数组的大小。

​    所以知道了这些也就很好去编码了,但是还要注意这个函数上面给的注释,注释的意思是说返回的数组必须是已经被动态分配内存的,而且我们不需要去显式地去调用free函数,题目假定free函数会被调用。所以我就先动态分配能够容纳2个整数的数组(ps:严谨来说的话这里要判断分配内存是否成功),然后设置两层循环,第一层循环是从数组下标为0开始,第二层循环是从第一层循环的后一个数开始,然后判断num[i]+num[j]和我们的target是否相等,如果相等就把对应的数组下标赋值给我们动态分配内存的数组,并且将returnSize的值给2。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i = 0;
    int j = 0;
    int *result;
    result = (int*)malloc(sizeof(int)*2);
    for(i = 0;i<numsSize;i++){
        for(j = i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                result[0] = i;
                result[1] = j;
                *returnSize = 2;
                return result;
            }
        }
    }
    return result;
}

提交结果

McuBIP.png

​    从提交结果上来看,这个解法应该只是一般解法,从程序上我们就可以算出我们程序的时间复杂度为o(n2),当然肯定还有其它的解决方法,好在LeetCode对每一道题目都设置了有评论区,大家可以在这里交流对题目的看法,不过难受的是LeetCode里面看评论没有按照语言分类去看评论,这一点就很难受。

​    好了,今天刷题分享到此结束,我们下次再见。

扫描二维码关注公众号,回复: 10814249 查看本文章
发布了18 篇原创文章 · 获赞 20 · 访问量 1461

猜你喜欢

转载自blog.csdn.net/qq_40401866/article/details/103134028