零基础-力扣100题从易到难详解(持续更新)
1.两数之和
思路:
题目的意思是在数组里找到两个不同位置的数(不存在多解),使它们相加等于target,返回它们的下标。
我们要做的就是遍历每个数,看看哪两个数能加成target,脑海里飘过三个方法:第一个是最复杂的暴力枚举写双层循环,两两相加,这里显然时间复杂度是下面说的“底线”O(n^2);第二个是哈希表,一边扫一边把值-下标存字典,查差值是否存在,时间复杂度为O(n);第三种就是排序加双指针夹逼,但是会打乱原下标,需要额外的映射,属于比较炫技。
1.1暴力枚举(一些类知识)
class Solution(object):def twoSum(self,nums,target):#类内部声明的函数叫方法 python规定实例方法的第一个形参必须叫self 这个self代表将来调用该方法的那个对象本身,python解释器会自动把当前对象传进来
#在_init_里,self把值挂在当前这个对象自己身上,使之成为对象的一个属性,让后面任何地方都能通过这个对象访问它,要是没有赋值变量只能成为局部变量""":type nums: List[int]:type target: int:rtype: List[int]"""n = len(nums)#博主在这里做错了,tab对齐到def下面了for i in range(n-1):for j in range(i+1,n):if nums[i] + nums[j] == target:return[i,j]return []#return这里要对应n不是对应def
1.2Hash表
class Solution(object):def twoSum(self,nums,target):""":type nums: List[int]:type target: int:rtype: List[int]"""seen = {} #key : 存的是已经扫过的某个数,value:存的是这个数再nums的下标for idx,num in enumerate(nums):#用 enumerate 遍历 nums,每次拿到idx当前数字的下标,num当前数字的值,在这里相当于一个拆包语法need = target - numif need in seen:return [seen[need],idx]seen[num] = idx#如果 need 没找到,就把当前 num 记录到 seen 里,以备后面的数字来“配对”,这里num作为key,idx作为valuereturn []
1.3双指针
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 把 (值, 原下标) 二元组保存下来再排序arr = [(num, i) for i, num in enumerate(nums)]arr.sort(key=lambda x: x[0]) # 按值升序left, right = 0, len(arr) - 1while left < right:s = arr[left][0] + arr[right][0]if s == target:return sorted([arr[left][1], arr[right][1]])elif s < target:left += 1else:right -= 1return []