三数之和
刷题日期:2024-04-23
[[015.三数之和]]
思路
双指针法
算法思路
数组先排序, 使用for循环遍历子数组, 在子数组中双指针分别指向两端, 求和, 比0大则右指针左移, 比0小则左指针右移, 等于0则双指针同时向内移动
算法细节
1. 去重逻辑
在使用i遍历子数组的时候, 若碰到相同的元素则直接前进; 判断三数和为0时, j,k的移动也是如此, 遇到相同的元素继续移动
Code
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
result = []
i = 0
while i <= len(nums) - 3:
j = i + 1
k = len(nums) - 1
while j < k:
if nums[i] + nums[j] + nums[k] == 0:
result.append([nums[i], nums[j], nums[k]])
k -= 1
j += 1
while j < k and nums[k + 1] == nums[k]:
k -= 1
while j < k and nums[j - 1] == nums[j]:
j += 1
elif nums[i] + nums[j] + nums[k] > 0:
k -= 1
elif nums[i] + nums[j] + nums[k] < 0:
j += 1
while nums[i + 1] == nums[i] and i < len(nums) - 3:
i += 1
i += 1
return result
赎金信
刷题日期:2024-04-23
[[383. 赎金信]]
思路
哈希表
算法思路
magazine构建dict, 遍历ransomNote的每个字符, 如果dict没出现直接返回False, 若出现则判断dict中键的值, 若等于0则返回False, 遍历完则返回True
算法细节
1.
Code
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
dict_mag = {}
for i in range(len(magazine)):
if magazine[i] in dict_mag:
dict_mag[magazine[i]] += 1
else:
dict_mag[magazine[i]] = 1
for i in range(len(ransomNote)):
if ransomNote[i] in dict_mag:
if dict_mag[ransomNote[i]] > 0:
dict_mag[ransomNote[i]] -= 1
else:
return False
else:
return False
return True
四数相加II
刷题日期:2024-04-23
[[454.四数相加]]
思路
哈希表
算法思路
和两数之和类似, 但是将四个数组两两看作一个, 先遍历1,2数组, 把和及出现次数放到dict中, 再遍历3,4数组, 若(0-3,4数组的和)在dict出现, 则累加出现次数, 返回出现次数的和
算法细节
1.
Code
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
count = 0
dict_1 = {}
for i in nums1:
for j in nums2:
if i + j in dict_1:
dict_1[i + j] += 1
else:
dict_1[i + j] = 1
for i in nums3:
for j in nums4:
if (0 - i - j) in dict_1:
count += dict_1[0 - i - j]
return count
四数之和
刷题日期:2024-04-23
[[018.四数之和]]
思路
与三数之和类似
算法思路
三数之和使用一个for循环限定双指针移动范围, 四数之和需要使用两个for循环
算法细节
1.
Code
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
result = []
i = 0
l = len(nums) - 1
while i < len(nums) - 3:
l = i + 1
while l < len(nums) - 2:
j = l + 1
k = len(nums) - 1
while j < k:
if nums[i] + nums[j] + nums[k] + nums[l] == target:
result.append([nums[i], nums[l], nums[j], nums[k]])
k -= 1
j += 1
while j < k and nums[k + 1] == nums[k]:
k -= 1
while j < k and nums[j - 1] == nums[j]:
j += 1
elif nums[i] + nums[j] + nums[k] + nums[l] > target:
k -= 1
elif nums[i] + nums[j] + nums[k] + nums[l] < target:
j += 1
while nums[l + 1] == nums[l] and l < len(nums) - 2:
l += 1
l += 1
while nums[i + 1] == nums[i] and i < len(nums) - 3:
i += 1
i += 1
return result