之前自己已经准备了一段时间算法题,现在想整理出来做一个记录。
1.两数之和(简单)(数组,哈希表)(leetcode1)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:给定 nums = [2, 4, 3], target=7,返回 [1,2]
思路:字典
def twoSum(self, nums, target):
d={}
for i in range(len(nums)):
a=target-nums[i]
if nums[i] in d:
return d[nums[i]],i
else:
d[a]=i
2.和为S的两个数字(递增排序的数组)(剑指offer)/ 两数之和2-输入有序数组(leetcode167)
示例:给定 nums = [2,3,4], target=7,返回 [3,4]
def FindNumbersWithSum(self, a, tsum):
i,j=0,len(a)-1
while i<j:
sum=a[i]+a[j]
if sum==tsum:
return [a[i],a[j]]
if sum<tsum:
i+=1
if sum>tsum:
j-=1
return []
3.和为S的连续正数序列(剑指offer)
示例:和为100的序列, 返回:18,19,20,21,22
def FindContinuousSequence(self, tsum):
head,last,sum=1,2,3
temp=[]
while last<=(sum+1)/2:
if sum==tsum:
temp.append(range(head,last+1))
sum-=head
head+=1
if sum>tsum:
sum-=head
head+=1
if sum<tsum:
last+=1
sum+=last
return temp
4.三数之和(中等)(数组,双指针)(leetcode15)
给定一个包含n个整数的数组nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。
示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],返回:[[-1, 0, 1],[-1, -1, 2]]
def threeSum(self, nums):
nums.sort()
res=[]
for a in range(len(nums)-2):
if a>0 and nums[a]==nums[a-1]:
continue
target= -1 * nums[a]
i,j=a+1,len(nums)-1
while i<j:
if nums[i]+nums[j]==target:
res.append([nums[a],nums[i],nums[j]])
i=i+1
while i<j and nums[i]==nums[i-1]:
i=i+1
elif nums[i]+nums[j]<target:
i=i+1
else:
j=j-1
return res
5.最接近的三数之和(中等)(数组,双指针)(leetcode16)
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], target = 1.返回:最接近和为 2. (-1 + 2 + 1 = 2).
def threeSumClosest(self, nums, target):
nums.sort()
res=sum(nums[:3])
for a in range(len(nums)):
i,j=a+1,len(nums)-1
while i<j:
temp=nums[a]+nums[i]+nums[j]
if abs(res-target)>abs(temp-target):
res=temp
elif temp>target:
j-=1
else:
i+=1
return res
6.四数之和(中等)(leetcode18)
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和d 使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
示例:给定数组nums=[1, 0, -1, 0, -2, 2],target=0.返回:[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]]
7.四数相加2(中等)(leetcode454)
8.两数相加(中等)(链表)(leetcode2)
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8原因:342 + 465 = 807
def addTwoNumbers(self, l1, l2):
carry=0
res=pre=ListNode(0)
while l1 or l2 or carry:
if l1:
carry+=l1.val
l1=l1.next
if l2:
carry+=l2.val
l2=l2.next
carry,val=divmod(carry,10) #进位carry
pre.next=pre= ListNode(val) #pre.next = ListNode(val) , pre = pre.next
return res.next
9.两数相加2(中等)(leetcode445)