原因:
大三了,感觉自己是个废柴。点进LeetCode纯粹是因为生活所迫,并不是自己对这个玩意儿多有兴趣。写博客也仅仅是为了自己以后遇到类似的东西的时候,能找到代码看看(脑袋瓜子不太好用)。这篇文章是第一篇,也很可能是最后一篇,看我心情还想不想写吧。如果其中有什么问题,也希望看的人能告诉我,大家一起互相学习嘛。
数据结构学的很菜,还在慢慢重新学,学会了会更新更好的算法滴
语言选择:
C语言、Python
正题:
相关知识概念:
时间复杂度:
啊这。这是数据结构里面的内容,说实话当我看见他们LeetCode里面都在说自己项目的时间复杂度的时候,就感觉自己学的都还给老师了。
话不多说,链接自己进去慢慢看,用的别人的博客,如果有用,记得感谢
(数据结构)十分钟搞定时间复杂度(算法的时间复杂度)
其实在看完之后,就感觉再看代码能看出他的复杂度,但是让我慢慢说为啥,可能又说不出来,还是懂的不深。不过循环这个地方,简单理解就是循环一次就是1,循环n次就是n,循环里面套循环就是n*m(m为第二个循环的次数)。这个只包括常数阶,线性阶和平方阶。其他的遇到了再学吧(懒啊)
代码
C语言——暴力破解
选择C语言之后的提示代码:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
}
*nums:给定的整数数组
numSize:整数数组的大小
target:给定的整数目标值
*returnSize:返回数组的大小
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
for(int i=0;i<numsSize-1;i++)
{
for(int j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
int *moment = (int*)malloc(sizeof(int)*2);
moment[0]=i;
moment[1]=j;
*returnSize=2;
return moment;
}
}
}
return 0;
}
第一次循环选择numsSize-1是因为题目中说明,同一个数字不能使用两遍,如果只是在第二次循环后面添加一个if(i != j)明显是不能满足题干要求的。那么只能让j在i前面,也就是j要比i更大,同时j能达到最后一位而i不能达到,这样就能去掉最后一个数多次使用的可能性了。
代码 | 运行时间 | 内存消耗 | 时间复杂度 |
---|---|---|---|
两个循环解决 | 4 ms | 5.8M | O(n^2) |
Python——字典
代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
for i, num in enumerate(nums):
# 判断字典中的key是否存在
if target - num in hashtable:
# 需要返回的结果为两个数据下标
return [hashtable[target - num], i]
# 将之前的值存为key,数据下标存为值
hashtable[nums[i]] = i
return []
结果分析:
代码 | 运行时间 | 内存消耗 | 时间复杂度 |
---|---|---|---|
python | 40 ms | 14.9M | O(n) |
总结
我坦白,代码是看的LeetCode官方的代码。本来第二个应该用C语言写哈希表,但是我直说,我不会用C写哈希表,我忘了,看着官方给的好复杂啊。唉,C语言果然不是我的强项。python只是用了简单的字典,但是感觉还是很垃圾的样子。下一次再写LeetCode,坚决不看别人的了,自己肝。主要是以学习为主,总是看别人的总会忘。下次的东西将会是自己努力的成果(如果没有努力,可能就没有下次(手动狗头保命))