携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
前言
我真的感觉算法是很重要的,但是总是提不起兴趣去刷题,到目前为止就刷了十几道简单题,耗其中还有一部分还是对着答案看了几遍才刷完,极其艰辛,但是在刷题的过程中还是学到了很多语言的基础知识,算有点收获吧。其他高级思想倒是没学到很多,应该是刷太少了。主要是给自己的正向反馈太少了,自己没有坚持下去。从今天开始记录一下自己刷题的过程吧,一个极其菜的菜鸟的视角。
刷算法题我一直以为是一件非常非常枯燥的一件事情,我想想办法塞点其他的东西里面去。例如表情包,联想到的其他的地方的东西,日常的闲言碎语。
闲聊,第一题:两数之和
先聊聊其他的,等下再来面对痛苦
第一次刷leetcode 刷这道题那是2019年11月29日,算作是2020年的第一天吧,距离今天也就是2年6个月了
LeetCode第一道简单题拦下了无数人呀,以简单题筛选发现第一题有1W8的题解,除了第一道中等题超过有1w其他题都没有超过1w。
精选评论:
有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来
运行一夜了是不是超时了?
有人卷 有人摆 有人摆够了想卷,却连里扣的第一题都做不出来
笑死我了,看来是真的有点反人类。
读题
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
说人话
给一个值(target)和一个都是整数的数组(num),在数组中找到两个数(x,y),这两个数相加为设定的目标值(x+y = target),答案要求返回两个数的下标(num.index(x),num.index(y))
这两个数不能是同一个元素,顺序不规定。
解题
先用最蠢的办法解决这个问题,遍历一次这数组
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)): # 从0下标开始遍历
res_1 = nums[i] # 假设当前答案第一个数组是num[i]
res_1_index = i #那么它的下标就是i
res_2 = target-res_1 # 假如城里的另外一个数就是target-num[i]
# print(res_2)
if res_2 in nums : #这里开始就要判断另外一个数在不在这个数组中
res_2_index = nums.index(res_2) #得到这个数的下标
if res_2_index!=res_1_index: # 注意限定条件,两个数不能是同一个位置
return [res_1_index,nums.index(res_2)] #如果都成立,就返回下标
其实写出来的代码看起来简单。其实我自己错了好几遍,分析一下经典的错误例子吧:
错误例子:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in nums:
for j in nums:
if i+j ==target:
return nums.index(i),nums.index(j)
双层暴力循环并且没有判断两个数是同一个数的另外清零,多做了很多无用功,复杂度O(n^2),但是学到了获取数组下标这个知识:array.index(i)
当时印象中还看了一下别人的写法,非常经典,学到了额外的知识:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dec={} # 一个空字典
for i ,j in enumerate(nums): # enumerate遍历数组,遍历出键和值
dec[j]=i # 把数组放在字典中存放
for k,l in enumerate(nums): #再通过enumerate遍历数组
m = dec.get(target-l) # 假设l为目标值。m为另一个目标值的下标
if m is not None and m !=k: # 假如m 有值的(代表数组有这个数),k为目标值得下标,并且两个值的下标不一样就返回答案,如果没有判断成功进入下一个循环,知道有答案。要是真的没有答案什么也不返回
return m,k
这个就是简化了下标获取,但是绕了很多弯路,使用了字典的get方法获取字典然后用 is none判断字典有没有某个值,从而得到下标。 然后数组的enumerate遍历同时的得到数组的键和值,都比较冷门。
总结
在评论中看到两极分化,一是有趣灵魂摆烂评论,说连题目都理解不了,毫无头绪。然后是大佬各种最优解,多语言炫技,用最少的代码写出答案。
现在看到第一题,应该还是能通过不断试错做出来的不至于毫无头绪,然后看到一些思路真的是真是妙蛙种子吃着妙脆角妙进了米奇妙妙屋妙到家了的感觉。 所以说一定要去做,不能靠想。
刷了十几道过后有时候会感觉有的题目再怎么看别人的答案也体会不到别人代码的用意,感觉自己脑袋逻辑转不过去,智商被碾压,非常无力绝望,就放弃了。
今天终于把第一题的总结写完了,回顾又发现了有很多改进的空间,哈哈,后面继续努力坚持慢慢改进。