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,这一差距不可谓不大。
那这是为什么呢?
其实我也不清楚,希望大家能来给我一些思路,或者来几个大佬教我一下。
标签:numsSize,return,nums,int,++,穷举,题记,LeetCode,两数 来源: https://blog.csdn.net/qq_38978404/article/details/89027271