一、复习昨天leetcode 题目 202快乐数(easy):
思路:既然是循环问题,可以用集合判断是否有循环,有循环 则为False:
解决:
class Solution:
def isHappy(self, n: int) -> bool:
def get_next(n):
total_sum = 0
while n>0:
n,digit = divmod(n,10)
total_sum += digit**2
return total_sum
res = set()
while n!=1 and n not in res:
res.add(n)
n = get_next(n)
return n==1
二、今日复习哈希表
1.leetcode题目 452 四数相加II(medium):
题目描述:
给你四个整数数组 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:
#方法count key = -n3-n4,此题目不用去重
hashmap = dict()
for n1 in nums1:
for n2 in nums2:
if n1 + n2 in hashmap:
hashmap[n1+n2] += 1
else:
hashmap[n1+n2] =1
count = 0
for n3 in nums3:
for n4 in nums4:
key = -n3-n4
if key in hashmap:
count += hashmap[key]
return count
2.leetcode 题目15 三数之和(medium):
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
###这道题目是在一个整数数组之中找三个数 跟454不一样 这道题需要去重
#双指针方法:
nums.sort()
l = len(nums)
res = []
for i in range(l):
if nums[i] > 0 :
break
if i >0 and nums[i] == nums[i-1]:
continue
left = i+1
right = l-1
while left < right:
if nums[i] + nums[left] + nums[right] > 0 :
right -= 1
elif nums[i] + nums[left] + nums[right] < 0:
left += 1
elif nums[i] + nums[left] + nums[right] == 0:
res.append([nums[i],nums[left],nums[right]])
while right > left and nums[right] == nums[right - 1]:
right -= 1
while right > left and nums[left] == nums[left + 1]:
left += 1
right -= 1
left += 1
return res
3.leetcode题目18 四数之和(medium):
题目描述:
给你一个由 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
你可以按 任意顺序 返回答案 。
思路:跟三数之和的思路一样,用双指针。
解决:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
l = len(nums)
res = []
for i in range(l):
if i>0 and nums[i] == nums[i-1]:
continue
for j in range(i+1,l):
if j>i+1 and nums[j] == nums[j-1]:
continue
left = j+1
right = l-1
while left < right:
summ = nums[i] + nums[j] + nums[left] + nums[right]
if summ<target:
left += 1
elif summ>target:
right -= 1
else:
res.append([nums[i],nums[j],nums[left],nums[right]])
while right>left and nums[left] == nums[left+1]:
left += 1
while right>left and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
return res