classSolution: defisAnagram(self, s: str, t: str) -> bool: # 首先定义一个record数组, 初始化全为0 record = [0] * 26 # 遍历s字符串, 因为都是小写字母, 所以用相对位置即可 # 对于s字符串, 出现的字母下标位置+1 for i in s: record[ord(i) - ord("a")] += 1 # 对于t字符串, 出现的字母下标位置-1 for i in t: record[ord(i) - ord("a")] -= 1 # 如果, t是s的字母异位词, 那么record数组1的地方应该刚好被抵消, 全为0 # 否则t不是s的字母异位词 for i in record: if i != 0: returnFalse returnTrue
Leetcode349 两个数组的交集
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defintersection(self, nums1: List[int], nums2: List[int]) -> List[int]: count1 = [0] * 1000 count2 = [0] * 1000 res = [] for i inrange(len(nums1)): count1[nums1[i]] += 1 for i inrange(len(nums2)): count2[nums2[i]] += 1 for i inrange(len(count1)): if count1[i] * count2[i] > 0: res.append(i) return res
classSolution: defisHappy(self, n: int) -> bool: res = set() while n != 1: sum = 0 for i instr(n): sum += int(i) ** 2 ifsumin res: returnFalse res.add(sum) n = sum returnTrue
Leetcode1 两数之和
简单的方式是直接两层for循环遍历所有可能的情况,但复杂度是O(n^2)
用map,也就是字典来解题
首先遍历nums,判断target - value是否出现在字典,若字典里有,则返回相应的下标
若没有,则将value-index这对键值对加入字典
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11
classSolution: deftwoSum(self, nums: List[int], target: int) -> List[int]: map = {} res = [] for index, value inenumerate(nums): if target - value inmap: res.append(index) res.append(map[target-value]) if value notinmap: map[value] = index return res
classSolution: defcanConstruct(self, ransomNote: str, magazine: str) -> bool: map = {} for i in magazine: map[i] = map.get(i, 0) + 1 for i in ransomNote: if i inmapandmap[i] > 0: map[i] -= 1 else: returnFalse returnTrue
Leetcode454 四数相加II
首先定义一个map,key是a+b的值,value是其出现的次数
再遍历c+d,若相加=0,则count加上对应的value
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: deffourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: map = {} count = 0 for a in nums1: for b in nums2: map[a+b] = map.get(a+b, 0) + 1 for c in nums3: for d in nums4: if -(c+d) inmapandmap[-(c+d)] > 0: count += map[-(c+d)] return count
Leetcode15 三数之和
首先将数组排序,然后有一层for循环,i从下标0的地方开始
同时定一个下标left 定义在i+1的位置上,定义下标right在数组结尾的位置上。
依然还是在数组中找到 abc 使得a + b +c =0
我们这里相当于 a = nums[i],b = nums[left],c = nums[right]
classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: res = [] nums.sort() for i inrange(len(nums)): # 因为是排序后的, 如果nums[i], 那就没必要继续了 if nums[i] > 0: return res # 每次i往后一位时,需要判断与之前是否相同,因为会重复 # 看参考样例[-1,0,1,2,-1,-4] if i> 0and nums[i] == nums[i-1]: continue left = i + 1 right = len(nums) - 1 while left < right: sum = nums[i] + nums[left] + nums[right] ifsum > 0: right -= 1 elifsum < 0: left += 1 else: res.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 right -= 1 left += 1 return res
classSolution: deffourSum(self, nums: List[int], target: int) -> List[List[int]]: nums.sort() res = [] for i inrange(len(nums)): if i > 0and nums[i] == nums[i-1]: continue for j inrange(i+1, len(nums)): if j > i+1and nums[j] == nums[j-1]: continue left = j + 1 right = len(nums) - 1 while left < right: sum = nums[i] + nums[j] + nums[left] + nums[right] ifsum > target: right -= 1 elifsum < target: left += 1 else: res.append([nums[i], nums[j], 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