字符串匹配
摘要:KMP 算法 Knuth-Morris-Pratt(KMP) 算法用于搜索给定字符串中的模式。 首先,它在模式中找到称为LPS的重复子串,并将LPS信息存储在数组中。 其次,进行字符串匹配。当发生不匹配时,它利用 LPS 数组来决定从哪里开始下一个匹配,以避免多余的旧比较。 如下图 第一次匹配失败后
阅读全文
LeetCode —— 排序
摘要:148. 排序链表 一般都用归并排序,因为是单向链表,其它排序算法根据下标找元素,向前遍历等都比较困难 主函数流程是: 如果 head==null || head.next==null return head。因为 head.next == null 即只有一个元素时,不用再划分了,而且一个元素本身
阅读全文
排序算法总结
摘要:排序算法复杂度比较 快速排序 基准元素的选取会影响复杂度,最坏的情况可能到 O(n2) 选取区间起始元素 选取区间结束元素 在区间内随机选取一元素 !!!! 注意下面 这个,一定要先找右边,再找左边 // 在右边 找到第一个小于 pivot 的(所以大于【等于】的都忽略) while (nums[r
阅读全文
LeetCode —— 二分查找
摘要:33. 搜索旋转排序数组 翻转点在前半部分 nums[mid]<=nums[low] 而后半部分是单调递增的,比较好判断。可以判断如果 nums[mid] < target <= nums[high] ,去后半部分 else 去后半部分 else 翻转点在后半部分 nums[mid]>nums[lo
阅读全文
LeetCode —— 子数组/子串/子序列
摘要:560. 和为 K 的子数组(前缀和计数map) 官方题解:https://leetcode.cn/problems/subarray-sum-equals-k/solution/he-wei-kde-zi-shu-zu-by-leetcode-solution/ 假设 left 到 right 下
阅读全文
LeetCode —— 哈希表
摘要:1. 两数之和 class Solution { public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; Map<Integer, Integer> map = new HashMap(); for (int
阅读全文
LeetCode —— 买卖股票的最佳时机专题
摘要:121. 买卖股票的最佳时机 minPrice 维护到当天为止的最低价格 maxProfit 维护到当天我为止的最大利润 例如: [2,5,1,3], 第二天: minPrice=2 maxProfit=3; 第四天:minPrice=1 maxProfit=max(3, 3-1=2)=3; cla
阅读全文
LeetCode —— 贪心
摘要:55. 跳跃游戏 如果当前数字为3,代表在这一格可以跳1或2或3格 维护一个全局最远可到达的下标 maxReach 遍历 nums 数组,如果 maxReach 小于当前下标 i ,说明现在这里就不可以到达,更别说终点了,return false 接下来就是现在这个下标可以到达的情况 现在这个下标的
阅读全文
LeetCode —— 图
摘要:200. 岛屿数量 695. 岛屿的最大面积 精品题解 https://leetcode.cn/problems/number-of-islands/solution/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/ 注意深度优先遍历,对一格陆地
阅读全文
LeetCode —— 滑动窗口
摘要:904. 水果成篮 用一个 Map 记录当前窗口的情况: key - 水果种类 value - 这个水果种类在当前滑动窗口里出现的次数 维持一个 left 指针到 right 指针的滑动窗口 每次 right 右移一位,将这个新加入窗口的 fruits[right] 种类放到 map 里,并将该种类
阅读全文
LeetCode —— 数组和矩阵
摘要:59. 螺旋矩阵 II 定义一个总数,是所有格子走完中心的最大数,target = n*n 从 1 开始,每走一步,当前数 +1 ,while(curNum<=target) 就继续走 定义每圈螺旋走位的边界,初始值:left=0; right=n-1; top=0; bottom=n-1; 1、在
阅读全文
LeetCode —— 动态规划
摘要:70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? f(x) = f(x-1) + f(x-2) f(0)=1 f(1)=1 f(2)=2 > f(3)=3 > f(4)=5 设一个存放三个整数的数组,分别保存 f(
阅读全文
LeetCode —— 二叉树操作
摘要:543. 二叉树的直径 乍看是 根节点的 左子树最大高度 + 右子树最大高度 + 1 (如图一) 但其实不能这样,因为路径可能并不经过根节点(如图二) 因此要用一个 max 来保存最后的最大路径和 在求二叉树高度的递归中,在每个根节点(在每次递归中),比较 max 与 以这个当前根节点的 左子树最大
阅读全文
LeetCode —— 单调栈/单调队列
摘要:42. 接雨水(单调递减栈) class Solution { public int trap(int[] height) { int res = 0; Stack<Integer> leftWallStack = new Stack(); int len = height.length; left
阅读全文
LeetCode —— 递归 dfs、回溯
摘要:22. 括号生成 class Solution { public List<String> generateParenthesis(int n) { List<String> result = new ArrayList(); if (n == 0) { return result; } // 必须
阅读全文
LeetCode —— 链表操作
摘要:21. 合并两个有序链表 可以和后面的 23. 合并 K 个升序链表 结合在一起看,不过这里只有两个链表,不用优先级队列,简单一比较就好 注意这个 // 这个head是特意造的,只是为了后面插入新节点的时候好插入,可以不用对头节点做特殊判断。最后返回head.next即可 ListNode head
阅读全文
LeetCode —— 双指针
摘要:15. 三数之和 (为0) 下标不能是重复的,必定右 i<l<r 1、先对数组排序(从小到大) 2、外层 i 遍历 如果 nums[i] > 0 ,整个 nums[] 后面的必定无法有三元组为0(排过序了,后面的 nums[l] nums[r] 都会大于0)。break。 如果 nums[i] =
阅读全文
LeetCode —— 杂
摘要:1. 两数之和 public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> num2IndexMap = new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i
阅读全文
堆与堆排序
摘要:大顶堆:每个父节点都大于子节点 小顶堆:每个父节点都小于子节点 在堆中,每次加入元素或者移除元素,都要调整堆的位置,使其满足堆的定义。 常用于 topK 问题,k 个最大/最小元素,每次弹出大顶堆/小顶堆 堆顶元素即可。 以及堆排序问题,堆排序可以看成是将待排序的数组元素依次加入堆(每次加入都调整堆
阅读全文