知识点
题目
两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 : 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
class Solution :
def twoSum ( self, nums : List[ int] , target : int) - > List[ int] :
hrashtable= dict ( )
print ( hrashtable)
for i, num in enumerate ( nums) :
if target- num in hrashtable :
return [ hrashtable[ target- num] , i]
else :
hrashtable[ num] = i
return None
四数相加 II
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 示例:
class Solution :
def fourSumCount ( self, nums1 : List[ int] , nums2 : List[ int] , nums3 : List[ int] , nums4 : List[ int] ) - > int:
harshmap= dict ( )
count= 0
for i in nums1 :
for j in nums2 :
if i+ j in harshmap :
harshmap[ i+ j] += 1
else :
harshmap[ i+ j] = 1
for i in nums3 :
for j in nums4 :
key= 0 - i- j
if key in harshmap :
count+= harshmap[ key]
return count
赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例: 输入:ransomNote = “a”, magazine = “b” 输出:false
class Solution :
def canConstruct ( self, ransomNote : str, magazine : str) - > bool:
hashtable= [ 0 ] * 26
for i in magazine :
hashtable[ ord ( i) - ord ( "a" ) ] += 1
for j in ransomNote :
hashtable[ ord ( j) - ord ( "a" ) ] -= 1
if hashtable[ ord ( j) - ord ( "a" ) ] < 0 :
return False
return True
三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例:
class Solution :
def threeSum ( self, nums : List[ int] ) :
n= len ( nums)
result= [ ]
if nums== None or n< 3 :
return None
nums. sort ( )
for i in range ( n) :
if nums[ i] > 0 :
break
if i> 0 and nums[ i] == nums[ i- 1 ] :
continue
left= i+ 1
right= n- 1
while ( left< right) :
if nums[ i] + nums[ left] + nums[ right] == 0 :
result. append ( [ nums[ i] , nums[ left] , nums[ right] ] )
while ( left!= right and nums[ right] == nums[ right- 1 ] ) : right-= 1
while ( left != right and nums[ left] == nums[ left+ 1 ] ) : left+= 1
left+= 1
right-= 1
elif nums[ i] + nums[ left] + nums[ right] > 0 :
right-= 1
else :
left+= 1
return result
四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 <= a, b, c, d < n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你可以按 任意顺序 返回答案 。 示例: 输入:nums = [1,0,-1,0,-2,2], target = 0 输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
class Solution :
def fourSum ( self, nums : List[ int] , target : int) - > List[ List[ int] ] :
n= len ( nums)
if nums== None and n< 4 :
return None
res= [ ]
nums. sort ( )
for k in range ( n) :
if nums[ k] > target and ( nums[ k] > 0 or target> 0 ) :
break
if k> 0 and nums[ k] == nums[ k- 1 ] :
continue
for i in range ( k+ 1 , n) :
if nums[ k] + nums[ i] > target and ( nums[ k] + nums[ i] > 0 or target> 0 ) :
break
if i> k+ 1 and nums[ i] == nums[ i- 1 ] :
continue
left= i+ 1
right= n- 1
while ( left< right) :
sum= nums[ k] + nums[ i] + nums[ left] + nums[ right]
if sum> target:
right-= 1
elif sum< target:
left+= 1
else :
res. append ( [ nums[ k] , nums[ i] , nums[ left] , nums[ right] ] )
while ( left!= right and nums[ left] == nums[ left+ 1 ] ) : left+= 1
while ( left!= right and nums[ right] == nums[ right- 1 ] ) : right-= 1
left+= 1
right-= 1
return res