力扣 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 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

示例 :
image

输入:[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
posted @ 2026-07-24 22:16  hannahhx  阅读(5)  评论(0)    收藏  举报