当前位置: 首页 > news >正文

LeetCode 100 -- Day6

1. 哈希:49、128

(1)49 字母异位词分组 -- 字典

from collections import defaultdict
class Solution(object):def groupAnagrams(self, strs):"""创建字典{sorted_string:原str}"""results=defaultdict(list)for word in strs:key = "".join(sorted(word))results[key].append(word)return results.values()

(2)128 最长连续序列 -- 集合

class Solution(object):def longestConsecutive(self, nums):if len(nums)==0:    return 0max_len = 0num_set = set(nums)while num_set:cur_num = num_set.pop()cur_len = 1lower = cur_num-1while lower in num_set:num_set.remove(lower)lower -= 1cur_len += 1higher = cur_num + 1while higher in num_set:num_set.remove(higher)higher += 1cur_len += 1max_len = max(max_len,cur_len)return max_len

2. 二分查找:34、33

(1)34 在排序数组中查找元素的第一个和最后一个位置

class Solution(object):def searchRange(self, nums, target):n = len(nums)if n==0:    return [-1,-1]left,right = 0, n-1while left<=right:mid = (left+right)//2if nums[mid]<target:left = mid+1elif nums[mid]>target:right = mid-1else: start=end=midwhile start>0 and nums[start-1]==target:start -= 1while end<n-1 and nums[end+1]==target:end += 1return [start,end]return [-1,-1]

(2)33 搜索旋转排序数组

方法一:两次二分,先找旋转点

class Solution(object):def find(self,nums,target,left,right):while left<=right:mid = (left+right)//2if nums[mid]==target:return midelif nums[mid]<target:left = mid+1else:right = mid-1return -1def search(self, nums, target):"""第一次二分查找最小值位置"""left,right = 0,len(nums)-1while left<right:mid = (left+right)//2if nums[mid]>nums[right]:left = mid+1else:right = mid     ## mid对应的可能是最小值rotate = left"""根据旋转点确定在哪个有序区间进行二分查找"""if rotate==0:## 旋转点在开头return self.find(nums, target, 0, len(nums)-1)elif nums[0]<=target:## 目标值在左半部分(较大值部分)return self.find(nums, target, 0, rotate-1)else:## 目标值在右半部分(较小值部分)return self.find(nums, target, rotate, len(nums)-1)

方法二:一次二分查找

class Solution(object):def search(self, nums, target):left,right = 0,len(nums)-1while left <= right:mid = (left+right)//2if nums[mid]==target:return mid"""左半部分有序"""if nums[left]<=nums[mid]:if nums[left]<=target<nums[mid]:right = mid-1else:left = mid+1"""右半部分有序"""if nums[mid]<=nums[right]:if nums[mid]<target<=nums[right]:left = mid+1else:right = mid-1return -1

3. 回溯:39、22、79、131

(1)39 组合总和

  • 当组合中允许元素重复:则迭代的起始值就是i,每次递增
  • 当组合中不允许重复:迭代的起始值是i + 1,每次递增
  • 当这是排列不是组合:迭代的起始值是传进去的start(初始位),每次都从头开始遍历所有元素
class Solution(object):def combinationSum(self, candidates, target):def backtrack(start, cur_result, cur_sum):if cur_sum==target:results.append(cur_result[:])returnfor i in range(start,len(candidates)):num = candidates[i]"""剪枝:如果当前和加上数字超过目标值,跳过后续更大的数字"""if cur_sum+num>target:break"""选择当前数字"""cur_result.append(num)cur_sum += num"""递归:从当前索引开始(允许重复使用)"""backtrack(i,cur_result,cur_sum)"""回溯:撤销当前数字的选择"""cur_result.pop()cur_sum -= numresults=[]candidates = sorted(candidates)backtrack(0,[],0)return results

(2)22 括号生成

class Solution(object):def generateParenthesis(self, n):def backtrack(cur_result,left,right):if len(cur_result)==2*n:results.append(cur_result[:])return"""左括号数量<n,添加左括号(直到n)"""if left<n:backtrack(cur_result+'(',left+1,right)"""右括号数量<左括号数量,添加右括号直到一样(匹配)"""if right<left:backtrack(cur_result+')',left,right+1)results = []backtrack("",0,0)return results

(3)79 单词搜索

class Solution(object):def exist(self, board, word):m,n = len(board),len(board[0])directions = [(0,1),(0,-1),(1,0),(-1,0)]def backtrack(row,col,word_index):"""若完全匹配(当前index与word长度相同)→True"""if word_index==len(word):return True"""不匹配的情况/超出边界 → False"""if row<0 or row>=m or col<0 or col>=n or board[row][col]!=word[word_index]:return False"""标记当前位置已访问"""temp = board[row][col]board[row][col] = "0""""查找四个方向"""for dr,dc in directions:if backtrack(row+dr,col+dc,word_index+1):return True    """回溯:恢复单元格原始值"""board[row][col] = tempreturn Falsefor i in range(m):for j in range(n):if backtrack(i,j,0):return Truereturn False

(4)131 分割回文串

class Solution(object):def partition(self, s):def isPalindrome(s):i,j = 0,len(s)-1while i<j:if s[i]==s[j]:i+=1j-=1else:return Falsereturn Truedef backtrack(start,cur_result):"""当遍历到字符串末尾时,保存当前分割方案"""if start==len(s):results.append(cur_result[:])return"""尝试所有可能的结束位置"""for end in range(start+1,len(s)+1):substr = s[start:end]"""如果当前子串是回文,继续分割剩余部分s[end:]"""if isPalindrome(substr):cur_result.append(substr)backtrack(end,cur_result)cur_result.pop()results=[]backtrack(0,[])return results 

http://www.dtcms.com/a/351123.html

相关文章:

  • 论文阅读:CIKM 2024 Empowering Private Tutoring by Chaining Large Language Models
  • 低空经济产业白皮书:音视频链路在智能飞行体系中的核心地位
  • 验证码请求与缓存问题解决方案
  • 用无标签语音自我提升音频大模型:SI-SDA 方法详解
  • 【JavaEE】(19) MyBatis-plus
  • 基于SpringBoot的考研资讯平台
  • 没有cpolar:会议记录手忙脚乱;有了cpolar:CapsWriter语音转文字轻松搞定
  • 如何在GitHub找到10k+个stars的仓库
  • USB摄像头驱动完整分析 (从插入到出画)
  • 飞算JavaAI:Java开发新时代的破晓之光
  • 基于印染数据的可视化系统设计与实现
  • 【笔记】大模型业务场景流程综述
  • (论文速读)MBQ:大型视觉语言模型的模态平衡量化
  • 深度学习在金融订单簿分析与短期市场预测中的应用
  • 力扣hot100:搜索旋转排序数组和寻找旋转排序数组中的最小值(33,153)
  • 大语言模型(LLM)基本原理浅析:从“冰箱做菜“到多模型对比实战
  • 理解SSH服务
  • onnx入门教程(七)——如何添加 TensorRT 自定义算子
  • 深度剖析初始化vue项目文件结构!!【前端】
  • 【分布式技术】Kafka 数据积压全面解析:原因、诊断与解决方案
  • 前沿技术借鉴研讨-2025.8.26(多任务分类/预测)
  • 极简 useState:手写 20 行,支持多次 setState 合并
  • 常用Nginx正则匹配规则
  • HTML的form表单
  • 状态模式与几个经典的C++例子
  • 《分布式任务调度中“任务重复执行”的隐性诱因与根治方案》
  • 记一次clickhouse查询优化之惰性物化
  • 手机移动代理IP:使用、配置、维护的10问10答
  • 通义灵码插件——AI 重构表单开发!半小时搭建可视化拖拽系统,效率碾压传统模式
  • 如何了解云手机的兼容性?