第一题 454. 四数相加 II
思路:
先分析题目,要求从四个数组中取出来四个数,然后这个四个数的和为零,这里主意,他要求的是求多少个数组,那我们其实就不用记录,i、j,k,l的值,只需要用哈希表记录数组里面的值就行不用注意下标,我们通过遍历, 来讲A、B两个数组的值里面任意组合存入数组,然后同样方法去遍历
空间复杂度: O(n2) ,时间复杂度 O(n2)
Python
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
A_B_dict = {}
C_D_dict = {}
for i in range(len(nums1)):
for j in range(len(nums2)):
if A_B_dict.__contains__(nums1[i]+nums2[j]):
A_B_dict[nums1[i]+nums2[j]] +=1
else:
A_B_dict[nums1[i]+nums2[j]] = 1
ans = 0
for i in range(len(nums3)):
for j in range(len(nums4)):
if A_B_dict.__contains__(0-(nums3[i]+nums4[j])):
ans+=A_B_dict[0-(nums3[i]+nums4[j])]
return ans
本题收获
第二题383. 赎金信
思路:
因为ransomNote和magazine中全部是小写字母构成,我们用数组来记录magazine中各个字母出现的次数,然后遍历ransomNote,出现对应字母就减一,如果最后出现record里面有小于零的情况就返回False
空间复杂度: O(n) ,时间复杂度 O(n)
Java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
// Map<String,Integer> r = new Map<String,Integer>();
// Map<String,Integer> m = new Map<String,Integer>();
int[] record = new int[26];
for( char c : magazine.toCharArray()){
record[c - 'a'] +=1;
}
for( char c : ransomNote.toCharArray()){
record[c-'a'] -= 1;
}
for(int i:record){
if(i<0){
return false;
}
}
return true;
}
}
本题收获
第三题15. 三数之和
思路:
相较于使用hash表,双指针会避免后面hash去重的过程。我们采用双指针的方式来解决这个问题,同样需要注意,这个三元组里面存放的是值而非下表,所以我们可以先讲nums进行排序,然后使用双指针的思路解决问题
空间复杂度: ,时间复杂度
Python
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ans = []
n = len(nums)
nums.sort()
if n < 3:
return ans
for i in range(n-2):
left = i+1
right = n-1
if nums[i]>0:
break
if ans != [] and ans[-1][0] == nums[i]: continue
while left < right:
# print("i",i,"left",left,"right",right)
temp = nums[i] + nums[left] + nums[right]
# print("i",i,"left",left,"right",right,"temp", temp)
if temp == 0:
ans.append([nums[i] , nums[left] , nums[right]])
# print("i",i,"left",left,"right",right)
while left < right - 1 and nums[left] == nums[left + 1]:
left += 1
while right > left + 1 and nums[right] == nums[right - 1]:
right -= 1
print("i",i,"left",left,"right",right)
# temp = nums[i] + nums[left] + nums[right]
if temp > 0:
right -= 1
else:
left += 1
return ans