力扣 hot100 Day1:哈希/双指针
49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 :
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
思路 : 两个字符串排序后相同即满足 构建字典-排序后结果为key,原字符串为value
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
str_dict={}
for s in strs:
sp=''.join(sorted(s)) #对字符串内部的字符排序用sorted 排完后是个字符列表 需要用''.join重新组成一个字符串
if sp not in str_dict: #若该键不在字典中 先加入键
str_dict[sp]=[]
str_dict[sp].append(s) #加入值
return list(str_dict.values())
128. 最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 :
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
思路 : 先定位该最长连续序列的起点 即如果pos处往左没有比他小的值 该pos才是起点 从此处开始向右寻找该序列
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
maxlen=0
num_set=set(nums) #先利用set去重
for i in num_set:
if i-1 not in num_set: #由于要求最长连续 即等差为1 对num_set中的元素显化为i-1不存在时 才开始算一个序列
cnt=1
j=i+1
while j in num_set: #不断寻找 i+1 i+2...
cnt+=1
j+=1
maxlen=max(maxlen,cnt)
return maxlen
283. 移动0
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 :
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
思路 : 记录下一个非0元素的位置
class Solution:
def moveZeroes(self, nums: List[int]) -> None: #moveZeroes -> None表明该函数无需return
n=len(nums)
pos=0 #记录下一个非0元素的位置 也即当前有多少个非0元素
for i in nums:
if i!=0:
nums[pos]=i
pos+=1
for i in range(pos,n):
nums[i]=0
11. 盛水最多的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
示例 :

输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
思路 : 双指针 移动规则--左右两侧指针内收 宽度必然减小 所以移动需要尽量找到高度更高的,所以需要移动左右指针所指高度中更矮的那边
class Solution:
def maxArea(self, height: List[int]) -> int:
maxsq=0
n=len(height)
L,R=0,n-1
while L<R:
maxsq=max(maxsq,(R-L)*min(height[L],height[R]))
if height[L]<height[R]:
L+=1
else:
R-=1
return maxsq
15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 :
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
思路 : 固定一个数,在它右边区间设置双指针寻找
注意特殊情况:
1)由于不要求三元组内按序,所以直接sort,那么被固定的该数本身若>0,就直接return后边都不需要看了
2)注意去重 固定数开始时去重+ 找数过程中去重
class Solution:
def threeSum(self, nums: list[int]) -> list[list[int]]:
res=[]
nums.sort()
n=len(nums)
for i in range(n):
if nums[i]>0 : return
if i>0 and nums[i]==nums[i-1]: continue #固定数开始时去重
L, R=i+1, n-1
while L<R:
if nums[i]+nums[L]+nums[R]==0:
res.append(( nums[i], nums[L], nums[R]))
while L<R and nums[L+1]==nums[L]: L+=1
while L<R and nums[R-1]==nums[R]: R-=1
#继续在他的区间中移动左右指针向内找
L+=1
R-=1
elif nums[i]+nums[L]+nums[R]<0: L+=1
else: R-=1
return res
浙公网安备 33010602011771号