LeetCode新手刷题记——关于两数之和的思考

首先是题目描述:
在这里插入图片描述
拿到这个问题我的脑子里就有了一个邪恶的想法——暴力穷举。
于是我使用了c语言按照自己的想法写了一个template,结果执行的时候出现了一堆问题,我也不知道哪有问题,于是就看评论区别人的答案,然后照着改就对。

int* twoSum(int* nums, int numsSize, int target) {

        static int a[2] = {0};

        for(int j = 0; j < numsSize; j++)
            for(int k = j + 1; k < numsSize; k++)
                if(nums[k] + nums[j] == target)
                {
                    a[0] = j;
                    a[1] = k;
                    return a;
                }   
        return 0;
   }

这是我一开始的答案,是不是很简单,平平无奇。但是在看到评论区一位朋友的答案后,我一下悟出了很多。
他在for循环上动了手脚,我们一般的想法是拿第一个数和它后面的数相加看等不等于目标数,这么算时间复杂度就是n*(1+2+3+…+n-1);这位朋友是这么想的,我反过来,从第二个数开始,只与前面的数进行加法比较,也是一样达到了穷举的目的。即:

        for(int j = 1; j < numsSize; j++)
            for(int k = 0; k < j; k++)

两者的时间复杂度是一样的,但是这样做前者执行用时280ms,而后者只有96ms,这一差距不可谓不大。
那这是为什么呢?
其实我也不清楚,希望大家能来给我一些思路,或者来几个大佬教我一下。

猜你喜欢

转载自blog.csdn.net/qq_38978404/article/details/89027271