1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
''' 1.创建一个哈希表 2.遍历数组,值num[i]、索引i保存至哈希,继续下一轮,如出现补数值在哈希表,则返回补数值的相对应哈希键,于是[num_map[j],i] ''' class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: num_map = {} for i in range(len(nums)): j = target - nums[i] if j in num_map: return [num_map[j], i] num_map[nums[i]] = i if __name__ == "__main__": # 测试用例 solution = Solution() nums = [2, 7, 11, 15] target = 9 print(solution.twoSum(nums, target))
2.字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
'''
题解:
1.创建一个字典result,遍历列表,对每个列表内字母进行排序组合,结果保存为key
2.判断key是否在字典中,若不在则创建空列表,在的话就把value保存到该字典中,以键值对的方式。
3.以列表方式返回所有键值对,字典的 values() 方法会返回所有值的视图,转成列表后就是分组好的二维列表。
'''
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
result = {}
for s in strs:
key = ''.join(sorted(s))
if key not in result:
result[key] = []
result[key].append(s)
return list(result.values())
if __name__ == '__main__':
solution = Solution()
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
print(solution.groupAnagrams(strs))
3.最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
'''
题解:
1.数组集合去重
2.集合遍历,判断num是不是第一个连续数字,是的话继续循环number+1是否在集合中,不在则退出循环,取最大长度
'''
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if not nums:
return 0
setnum = set(nums)
max_length = 0
for num in setnum:
if num-1 not in setnum:
length = 1
number = num
while(number+1 in setnum):
number += 1
length += 1
max_length = max(max_length, length)
return max_length
if __name__ == '__main__':
solution = Solution()
nums = [100, 4, 200, 1, 3, 2]
print(solution.longestConsecutive(nums))
4.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
'''
题解:
1.判断nums非0
2.两个指针i、j,遍历数组,若i指针的值不为0,则i、j交换,j往后加1,最后结果为0的都在末尾
'''
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
if not nums:
return 0
j = 0
for i in range(len(nums)):
if nums[i]:
nums[i], nums[j] = nums[j], nums[i]
j = j + 1
return nums
if __name__ == '__main__':
solution = Solution()
nums = [0, 1, 0, 3, 12]
print("移动零之前:", nums)
print("移动零之后:", solution.moveZeroes(nums))
5.盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
题解:
1.底 right-left, 高 min(height_left, height_right)
2.area = (right-left)*min(height_left, height_right)
3.其中指针height[left]<height[right]时,可跳过,为left+1,反之right-1
'''
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
max_area = 0
while left < right:
area = min(height[left], height[right])*(right - left)
max_area = max(area, max_area)
if height[left] < height[right]:
left = left + 1
else:
right = right - 1
return max_area
- THE END -
最后修改:2025年12月30日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://blog.grover.top/2024/08/19/leetcode_hot_1-5/
共有 0 条评论