找到字符串中所有字母异位词
找到字符串中所有字母异位词
找到字符串中所有字母异位词
clas 规则配置
合并区间 解题思路 按照左端点排序 维护一个当前正在合并的区间 依次扫描所有区间 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class Solution { public int[][] merge(int[][] intervals) { if (intervals == null || intervals.length == 0) { return new int[0][2]; } Arrays.sort(intervals, (a, b) -> { if (a[0] != b[0]) return Integer.compare(a[0], b[0]); return Integer.compare(a[1], b[1]); }); List<int[]> res = new ArrayList<>(); int start = intervals[0][0], end = intervals[0][1]; for (int i = 1; i < intervals.length; i ++) { int s = intervals[i][0], e = intervals[i][1]; if (s <= end) { end = Math.max(end,e); } else { res.add(new int[]{start, end}); start = s; end = e; } } res.add(new int[]{start, end}); return res.toArray(new int[res.size()][]); } } Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: if not intervals: return [] intervals.sort(key=lambda x: (x[0], x[1])) res = [] start, end = intervals[0] for s, e in intervals[1:]: if s <= end: end = max(end, e) else: res.append([start,end]) start, end = s, e res.append([start, end]) return res JS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /** * @param {number[][]} intervals * @return {number[][]} */ var merge = function(intervals) { if (!intervals || intervals.length === 0) { return []; } intervals.sort((a, b) => (a[0] - b[0]) || (a[1] - b[1])); const res = []; let [start, end] = intervals[0]; for (let i = 1; i < intervals.length; i ++) { const [s, e] = intervals[i]; if (s <= end) { end = Math.max(end, e); } else { res.push([start, end]); start = s; end = e; } } res.push([start, end]); return res; }; Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 func merge(intervals [][]int) [][]int { if len(intervals) == 0 { return [][]int{} } sort.Slice(intervals, func(i, j int) bool { if intervals[i][0] != intervals[j][0] { return intervals[i][0] < intervals[j][0] } return intervals[i][1] < intervals[j][1] }) res := make([][]int, 0, len(intervals)) start, end := intervals[0][0], intervals[0][1] for i := 1; i < len(intervals); i ++ { s, e := intervals[i][0], intervals[i][1] if s <= end { if e > end { end = e } } else { res = append(res, []int{start, end}) start, end = s, e } } res = append(res, []int{start, end}) return res }
基金学习
思路 用第一行作为列标记,matrix[0][j] == 0 表示第 j 列最终要清零。 用第一列作为行标记,matrix[i][0] == 0 表示第 i 行最终要清零。 第一行、第一列可能原本就包含 0,需要额外保存两个变量标识 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length, n = matrix[0].length; boolean row0 = false, col0 = false; for (int j = 0; j < n; j ++) { if (matrix[0][j] == 0) { row0 = true; break; } } for (int i = 0; i < m; i ++) { if (matrix[i][0] == 0) { col0 = true; break; } } for (int i = 1; i < m; i ++) { for (int j = 1; j < n; j++) { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 0; } } } for (int i = 1; i < m; i ++) { for (int j = 1; j < n; j ++) { if (matrix[i][0] == 0 || matrix[0][j] == 0) { matrix[i][j] = 0; } } } if (row0) { for (int j = 0; j < n;j ++) { matrix[0][j] = 0; } } if (col0) { for (int i = 0; i < m;i ++) { matrix[i][0] = 0; } } } }
轮转数组
题目 解题思路 设数组长度为 n: 要找的答案一定在 [1, n+1] 里面。 把数组当做一个哈希表,值 x 放在 x - 1 的位置。 ...
题目 不定长滑动窗口 + 计数哈希 右指针扩张窗口,直到覆盖了 t 的全部需求 一旦覆盖成功,左指针尽量收缩,变短 在收缩过程中持续更新最优答案 当收缩到不再满足条件时,再继续右扩 Java 解法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 class Solution { public String minWindow(String s, String t) { int m = s.length(), n = t.length(); if (n > m) return ""; int[] need = new int[128]; for (int i = 0; i < n; i ++) { need[t.charAt(i)] ++; } int missing = n; int bestLen = Integer.MAX_VALUE; int bestL = 0; int l = 0; for (int r = 0; r < m; r ++) { char c = s.charAt(r); if (need[c] > 0) { missing--; } need[c]--; while(missing == 0) { int len = r - l + 1; if (len < bestLen) { bestLen = len; bestL = l; } char leftChar = s.charAt(l); need[leftChar]++; if (need[leftChar] > 0) { missing ++; } l ++; } } return bestLen == Integer.MAX_VALUE ? "" : s.substring(bestL, bestL + bestLen); } } Python 解法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 class Solution: def minWindow(self, s: str, t: str) -> str: if len(t) > len(s): return "" need = [0] * 128 for ch in t: need[ord(ch)] += 1 missing = len(t) best_len = float("inf") best_l = 0 l = 0 for r, ch in enumerate(s): idx = ord(ch) if need[idx] > 0: missing -= 1 need[idx] -= 1 while missing == 0: cur_len = r - l + 1 if cur_len < best_len: best_len = cur_len best_l = l left_idx = ord(s[l]) need[left_idx] += 1 if need[left_idx] > 0: missing += 1 l += 1 return "" if best_len == float("inf") else s[best_l: best_l + best_len] JS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /** * @param {string} s * @param {string} t * @return {string} */ var minWindow = function(s, t) { if (t.length > s.length) return ""; const need = new Array(128).fill(0); for(let i = 0; i < t.length; i ++) { need[t.charCodeAt(i)] ++; } let missing = t.length; let bestLen = Infinity; let bestL = 0; let l = 0; for (let r = 0; r < s.length; r ++) { const idx = s.charCodeAt(r); if (need[idx] > 0) { missing --; } need[idx]--; while(missing === 0) { const len = r - l + 1; if (len < bestLen) { bestLen = len; bestL = l; } const leftIdx = s.charCodeAt(l); need[leftIdx]++; if (need[leftIdx] > 0) { missing ++; } l++; } } return bestLen === Infinity ? "" : s.slice(bestL, bestL + bestLen); }; Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 func minWindow(s string, t string) string { if len(t) > len(s) { return "" } need := make([]int, 128) for i:=0; i < len(t); i ++ { need[t[i]] ++ } missing := len(t) bestLen := 1<<30 bestL := 0 l := 0 for r := 0; r < len(s); r++ { c := s[r] if need[c] > 0 { missing-- } need[c]-- for missing == 0 { if r-l+1 < bestLen { bestLen = r-l+1 bestL = l } left := s[l] need[left]++ if need[left] > 0 { missing ++ } l++ } } if bestLen == 1 << 30 { return "" } return s[bestL : bestL + bestLen] }
mindmap 测试
基础用法 - Python 语法 - 注释 -  - 基本数据类型和操作符 - 数学运算 - 加减乘除 -  - 向下整除 -  - 除法的结果是浮点数 -  - 取模运算 -  - 幂运算 -  - 比较运算 - 等于/不等于 -  - 大于/小于 -  - 范围操作 -  - is/== -  - 布尔类型 - 首字母大写的 True/False -  - 布尔运算 -  - True/False 等价 1/0 -  - 比较运算 -  - None/0/emptry 容器都可以转为 False -  - 字符串 - 可以用 " 或者 ' 来创建字符串 -  - 字符串拼接 -  - 字符随机访问 -  - 字符串长度 -  - 格式化字符串 (> 3.6.0) -  - None - None 是对象 -  - 不能使用 == 比较,需要用 is -  - 变量和基础输入输出 - 打印函数 - 简单打印 -  - 指定结束符,不指定则是换行 -  - 输入 -  - 命名 - 没有声明,只有赋值 - 变量名是下划线格式 - 访问未赋值的变量 -  - if 表达式,类似于 ?: 三值判断 -  - 集合 - 列表 - 定义列表 -  - 列表追加值 -  - 列表移除值(尾部) -  - 下标访问 -  - 数组越界 -  - 切片操作 [start, end) (li[start:end:step]) -  - 深拷贝切片 -  - 删除指定位置元素 -  - 移除第一个出现的位置 -  - 在指定下标插入一个元素 -  - 找到第一个匹配元素的下标 -  - 拼接列表 -  - 元素是否在列表中 -  - 列表长度 -  - 列表乘法 -  - 元祖 - 不可修改的列表 -  - 长度为 1 的元祖必须以 , 结尾 -  - 类似列表的操作 -  - 元组解构 -  - 扩展解构 -  - 元组创建时可以不带括号 -  - 交换两个元素 -  - 字典 - 创建字典 -  - 字典 key 需要是不可变对象 -  - 查询某个 key 的值 -  - 列出所有 key 的值 -  - 列出所有 value 的值 -  - 判断 key 是否存在 -  - 查询不存在的 key -  - get 函数,查询不报错+指定默认值 -  - 向 dict 添加值 -  - 删除 dict 的值 -  - dict 析构 >3.5 -  - Set - 初始化 -  - set 的值不可变 -  - set 添加值 -  - 判断元素是否在 set 中 -  - 控制语句 - if-elif-else -  - for-遍历 list -  - range 生成 [0,num) 可迭代数字 -  - 指定开始/结束/步长的 range -  - 同时遍历列表的下标和值 -  - while 循环 -  - 异常处理 -  - 函数 - 使用 def 定义函数 -  - 使用关键字参数调用函数 -  - *args 接收位置参数 -  - **kwargs 接收关键字参数 -  - 返回多个值(以不带括号元祖形式) -  - 修改全局作用域 -  - 函数是一等公民,可以作为返回值返回 -  - 匿名函数 -  - 列表推导式,用渐渐的写法,快速生成一个列表 -  - 构造 dict -  - 模块 - 直接导入模块 -  - 导入模块中指定的函数 -  - 导入模块中所有的函数(不推荐) -  - 简写模块名 -  - 模块就是普通的 python 文件,模块名就是文件名 - 如果本地文件夹有 math.py 它会优先内置的 math.py 加载 - 类 - 创建类 -  - 使用类 -  - 继承 -  - 迭代器/可迭代对象 - 可迭代对象:能用来 for 遍历的对象 - 迭代器,能被 next() 取值的对象 - 生成器 -  - 装饰器 - 在不改变原函数的前提下,给函数包一层,从而增强它的功能 -  - 类型系统 - 类型标注 - 在代码里面把参数、返回值、变量等期望是什么类型写出来 -  - 类型是期望类型,不会默认强制检查,只是为了让人和工具看的更准确 -  - 容器类型标注 -  - 可选类型 None -  - 多种类型 -  - Any 类型,不确定类型 -  - 函数没有返回值 -  - 泛型 -  - 类型别名 -  - python 命令 - python -m - 把一个模块当成程序来运行 - python -m <模块名字> 会去模块搜索路径找到模块,然后像主程序一样执行 - 不带 -m 给的是一个文件,-m 给的是一个模块名 - pip 安装 - python -m pip --version 查看版本 - python -m pip install requests 安装一个包 - python -m pip install requests==2.31.0 安装指定版本的包 - python -m pip install --upgrade requests 升级一个包 - python -m pip list 查看已经安装的包 - python -m pip freeze > requirements.txt 导出当前环境依赖 - python -m pip install -r requirements.txt 按依赖文件安装 - python -m pip uninstall numpy 卸载软件包 - python -m pip install -i https://mirrors.aliyun.com/pypi/simple/ requests 临时配置镜像 - python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 永久配置镜像 - python -m pip config list 查看配置 - pip 配置文件 - ~/.pip/pip.conf -  - venv - 给某个 python 项目创建要给独立的虚拟环境 - 每个项目都有独立的 Python 包、pip 安装记录、依赖版本 - 创建虚拟环境 - python -m venv .venv - 在当前目录创建一个 .venv 的虚拟环境文件夹 - 激活虚拟环境 - source .venv/bin/activate - 虚拟环境安装包 - python -m pip install requests - 退出虚拟环境 - deactive - 解决的问题 - 同一个 Python 版本下 - 不同项目依赖隔离 - pyenv/conda - 安装多个 Python 版本 - 管理解释器版本 uv 安装包 - uv - 安装 uv - curl -LsSf https://astral.sh/uv/install.sh | sh - uv --version - uv 创建项目 - uv init myapp - 项目关键文件 - pyproject.toml:项目元数据与依赖声明 - uv.lock:锁文件,保证解析结果可以复现 - .venv:项目虚拟环境 - .python-version:项目使用的版本约束 - 依赖管理 - uv add requests - uv add "pydantic==2.11.0" - uv remove requests - 锁定和同步 - uv lock 解析依赖并生成 uv.lock - syncing 把锁文件里面的某个集合真正安装进项目环境 - 创建虚拟环境 - uv venv - 管理 python 版本 - uv python - 运行命令 - uv run - 如果不使用 uv run,就需要先激活虚拟环境后再直接执行命令