和为 k 的子数组
题目 思路 把子数组求和转换为前缀和差值计数。 ...
滑动窗口最大值
题目 单调队列 维护一个双端队列,里面存下标,让对应的值 nums[下标] 从队头到队尾单调递减: ...
最大数组和
题目 思路 思路 1 :动态规划 dp[i] = 以 i 位置结尾的最大子数组和 ...
无重复字符的最长子串
题目 for 滑动窗口循环遍历,每次遍历以 l 为起点,r 为终点的滑动窗口是否包含重复字符,如果包含,则 l++,否则不停移动 r。 ...
重启人生
找到字符串中所有字母异位词
题目 思路 利用定长滑动窗口,增量维护频次数组。 ...
clash 规则配置
Clash 规则配置 编辑规则 增加规则: 1 2 3 4 rules: - 'DOMAIN-KEYWORD,aliyuncs,DIRECT' - 'DOMAIN-SUFFIX,bilibili.com,DIRECT' - 'DOMAIN-KEYWORD,aliyuncs,DIRECT'
合并区间
合并区间 解题思路 按照左端点排序 维护一个当前正在合并的区间 依次扫描所有区间 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 }
基金
轮转数组
题目 解题思路 思路 1: 三次反转 右移 k 位等价为:把数组分成两段 A|B ,B 是最后 K 个,结果是 B|A ...