算法题知识点 + 算法题刷题
文章平均质量分 52
来杯黑美式
github:https://github.com/laiba345
展开
-
LeetCode 热题 HOT 100
leetcode最热100题原创 2023-08-03 09:24:07 · 184 阅读 · 0 评论 -
滑动窗口算法思想及习题
【代码】滑动窗口算法思想及习题。原创 2022-08-21 19:25:37 · 101 阅读 · 0 评论 -
JavaScript中的Map的使用 (滑动窗口使用Map)
因为这样初始化 left = right = 0 时区间 [0, 0) 中没有元素,但只要让 right 向右移动(扩大)一位,区间 [0, 1) 就包含一个元素 0 了。3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right),直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。2、我们先不断地增加 right 指针扩大窗口 [left, right),直到窗口中的字符串符合要求(包含了 T 中的所有字符)。窗口加入字符时,应该更新哪些数据?...原创 2022-08-18 17:08:27 · 228 阅读 · 0 评论 -
二叉树算法+ 二叉搜索树(BST)) + 习题(JavaScript)
二叉树算法(JavaScript)持续更新中原创 2022-08-12 10:14:57 · 332 阅读 · 0 评论 -
使用Mock技术模拟数据
使用mock技术模拟假数据原创 2022-08-08 16:20:44 · 1391 阅读 · 0 评论 -
JavaScript权威指南(原书第7版) 犀牛书
前端JS犀牛书重点知识(持续更新ing...)原创 2022-08-06 09:32:26 · 4614 阅读 · 0 评论 -
双指针技巧秒杀七道链表题目(Javascript)
LabuladongJavaScript 解决七道链表题目原创 2022-08-01 11:16:00 · 136 阅读 · 0 评论 -
Leetcode 88 - 合并两个有序数组
Leetcode 88 合并两个有序数组题目描述方法一让数组2中的元素放到数组1当中,然后再进行排序:当i = n的时候就停止了for(int i = 0; i != n; i++){ nums1[m+i] = nums2[i]; // 先合并}Arrays.sort(nums1);方法二因为两个数组都已经排好序了,所以我们可以使用双指针的思想,依次来比较每一个位置上的元素,双指针排序就是每次找出那个更小的元素,放到新的数组当中int p = 0, q = 0;int sor原创 2022-05-06 11:24:57 · 147 阅读 · 1 评论 -
BST(二叉搜索树)
BST(二叉搜索树)所谓二叉搜索树(Binary Search Tree,简称 BST)大家应该都不陌生,它是一种特殊的二叉树。特殊在哪里呢?简单来说就是:左小右大。BST的完整定义如下:BST 中任意一个节点的左子树所有节点的值都小于该节点的值,右子树所有节点的值都大于该节点的值。BST 中任意一个节点的左右子树都是 BST。有了BST的这种特性,就可以在二叉树中做类似二分搜索的操作,搜索一个元素的效率很高。一个合法二叉树的举例对于 BST 相关的问题,你可能会经常看到类似下面原创 2022-04-28 10:15:15 · 5837 阅读 · 0 评论 -
BFS算法解题套路框架(附习题)
BFS算法解题套路框架BFS 的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。BFS 相对 DFS 的最主要的区别是:BFS 找到的路径一定是最短的,但代价就是空间复杂度可能比 DFS 大很多,至于为什么,我们后面介绍了框架就很容易看出来了。算法框架BFS 出现的常见场景问题的本质就是让你在一幅「图」中找到从起点 start 到终点 target 的最近距离,这个例子听起来原创 2022-04-26 10:13:53 · 1436 阅读 · 0 评论 -
秒杀所有区间相关问题
区间问题所谓区间问题,就是线段问题,让你合并所有线段、找出线段的交集等等。主要有两个技巧:排序。常见的排序方法就是按照区间起点排序,或者先按照起点升序排序,若起点相同,则按照终点降序排序。当然,如果你非要按照终点排序,无非对称操作,本质都是一样的。画图就是说不要偷懒,勤动手,两个区间的相对位置到底有几种可能,不同的相对位置我们的代码应该怎么去处理。区间覆盖问题Leetcode 1288 删除被覆盖区间题目问我们,去除被覆盖区间之后,还剩下多少区间,那么我们可以先算一算,被覆盖区间有多少个,原创 2022-04-22 17:06:33 · 663 阅读 · 0 评论 -
一个函数秒杀2Sum 3Sum 4Sum问题
一个函数秒杀2sum 3sum 4sum问题一、twoSum问题力扣上的 twoSum 问题,题目要求返回的是索引,这里编一道 twoSum 题目,不要返回索引,返回元素的值:题目:如果假设输入一个数组 nums 和一个目标和 target,请你返回 nums 中能够凑出 target 的两个元素的值,比如输入 nums = [5,3,1,6], target = 9,那么算法返回两个元素 [3,6]。可以假设只有且仅有一对儿元素可以凑出 target。思路:我们可以先对 nums 排序,然原创 2022-04-20 10:33:54 · 225 阅读 · 0 评论 -
双指针技巧
双指针分类快慢指针:主要解决链表中的问题,比如典型的判定链表中是否包含环;左右指针:后者主要解决数组(或者字符串)中的问题,比如二分查找。快慢指针的常见算法快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前,慢指针 slow 在后,巧妙解决一些链表中的问题。判断链表中是否含有环单链表的特点:每一个节点只知道下一个节点,所以一个指针的话没有办法判断链表中是否含有环如果链表中不含环,那么这个指针最终会遇到空指针 null 表示链表到头了,这还好说,可以判断该链表不含环原创 2022-04-17 17:13:51 · 620 阅读 · 0 评论 -
二分查找算法详解
二分查找算法总结一句话:思路很简单,细节是魔鬼。二分查找场景寻找一个数寻找左侧边界寻找右侧边界关于上述场景,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证能灵活准确地写出正确的二分查找算法。二分查找代码框架int binarySearch(int[] nums, int target) { int left = 0, right = ...; while(...) { int mid原创 2022-04-17 16:57:47 · 179 阅读 · 0 评论 -
leetcode9 --回文数 Java
题目描述思路一使用java内置方法来解决StringBuilderStringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量new StringBuilder(字符串) 里面存储的是一个char数组class Solution { public boolean isPalindrome(int x) { // 思路一 String str1 = (new StringBuilder(x + "")).reverse().toSt原创 2022-03-22 19:14:46 · 561 阅读 · 0 评论 -
动态规划 - 买卖股票
动态规划的算法本质本质上就是穷举状态,然后在选择中选择最优解你只要记住状态和选择两个词即可以上面的题目为例子穷举框架dp[i][k][0 or 1]0 <= i <= n - 1, 1 <= k <= Kn 为天数,大 K 为交易数的上限,0 和 1 代表是否持有股票。此问题共 n × K × 2 种状态,全部穷举就能搞定。for 0 <= i < n: for 1 <= k <= K: for s in {原创 2022-03-20 21:15:15 · 735 阅读 · 0 评论 -
leetcode415 -字符串相加Java
题目描述思想代码实现class Solution { public String addStrings(String num1, String num2) { // 在开发中尽量使用StringBuilder进行字符串拼接 StringBuilder res = new StringBuilder(""); int i = num1.length() - 1, j = num2.length() - 1, carry = 0;原创 2022-03-07 21:16:38 · 270 阅读 · 0 评论 -
leetcode20 - 有效的括号Java
题目描述思路栈是一种先进后出的数据结构,处理括号问题的时候尤其有用思路:遇到左括号就入栈,遇到右括号就去栈中寻找最近的左括号,查看是否与之匹配在代码编写的时候,我们常常可以编写另外一个函数用于相应的调用,这样编写代码时候会显得更加简洁创建一个栈Stack<Character> left = new Stack<>();将一个字符串转换为字符数组s.toCharArray()代码实现class Solution { public boolean i原创 2022-03-05 20:24:43 · 474 阅读 · 0 评论 -
leetcode70爬楼梯 -- java
题目描述思路找规律,找到规律以后用函数表达式表示出来即可可以从斐波那契数列得到相应启发,使用动态规划来书写代码实现class Solution { // 备忘录,用一个数组来进行相应存取 int[] memo; public int climbStairs(int n) { /* 这种题目其实就是找规律,找到规律以后,用函数表达式表示出来即可,这些都是相当重要的 动态规划: 这题其原创 2022-03-05 19:14:39 · 308 阅读 · 0 评论 -
leetcode53 -最大子数组和 Java
题目描述代码实现:class Solution { public int maxSubArray(int[] nums) { /* 以num[i] 为结尾的最大子数组和为dp[i] dp[i]有两种选择,要么和前面相邻子数组连接,形成一个和更大的子数组 要么不与前面的子数组连接,自成一派,自己作为一个子数组。 在这两种选择中择优,就可以计算出最大子数组,而且空间复杂度还有优化原创 2022-02-27 23:05:50 · 418 阅读 · 0 评论 -
leetcode -- 141环形链表Java
题目描述要判断是否存在环,可以使用快慢指针的操作方式来进行代码实现/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { pu原创 2022-02-19 21:56:16 · 126 阅读 · 0 评论 -
leetcode -- 剑指Offer40.最小的k个数Java
题目描述:思路:直接进行排序 + 遍历 + 赋值堆快排思想代码实现class Solution { public int[] getLeastNumbers(int[] arr, int k) { // 先进行排序 Arrays.sort(arr); // 先创建一个数组进行存取 int[] arr1 = new int[k]; for(int i=0; i < k; i++){原创 2021-12-29 20:16:32 · 462 阅读 · 0 评论 -
leetcode977 -- 有序数组的平方Java
题目描述:思路:先将数组中的元素进行两两相乘,构成一个新的数组然后再对新的数组里面的元素进行排序操作java内置排序,Arrays.sort(数组)class Solution { public int[] sortedSquares(int[] nums) { // 思路很简单,先将数组中的元素进行两两相乘, // 先创建一个新的数组, int[] arr = new int[nums.length]; // 得到的结原创 2021-12-23 19:01:59 · 435 阅读 · 0 评论 -
leetcode344 -- 反转字符串Java
题目描述:思路:使用前后指针,前后指针指向的元素两两交换即可代码实现:class Solution { public void reverseString(char[] s) { // s在怎么说也是一个数组,进行反转的话,前后依次对调即可 int left = 0; int right = s.length - 1; while (left <= right){ // 在对调的过程中,中间值原创 2021-12-23 17:02:47 · 239 阅读 · 0 评论 -
leetcode509 -- 斐波那契数 Java
题目描述:方法一:递归 – 效率低代码实现:class Solution { public int fib(int n) { // 方法一:直接使用递归的方法来进行书写 if (n == 0){ return 0; } if (n == 1){ return 1; } return fib(n - 1) + fib(n -2); }}方原创 2021-12-23 16:31:43 · 229 阅读 · 0 评论 -
leetcode100/101 -- 相同的树/对称二叉树Java
leetcode100 – 相同的树题目描述:思路:使用二叉树遍历框架来遍历一遍二叉树,然后对比它们的节点是否相同就行了代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.v原创 2021-12-21 20:16:38 · 560 阅读 · 0 评论 -
leetcode144 -- 二叉树的前序遍历Java
题目描述:思路:二叉树的前序遍历:根 -> 左 -> 右代码实现:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNo原创 2021-12-21 15:28:35 · 551 阅读 · 0 评论 -
leetcode27/283 -- 移除元素/移动零Java
leetcode 27 – 移除元素题目描述:类似于之前文章中leetcode26题,需要使用双指针技巧中的快慢指针的思想如果fast 遇到需要去除的元素,则直接跳过,否则就告诉slow指针,并让知slow前进一步代码实现:class Solution { public int removeElement(int[] nums, int val) { // 这一类移除元素值的操作一般使用双指针中的快慢指针来进行操作 // 如果fast遇到需要去除的元素原创 2021-12-20 21:12:45 · 411 阅读 · 0 评论 -
leetcode136 -- 只出现一次的数字Java + Python
题目描述:方法一:思路:出现了统计数组中元素出现次数的题目,可以使用字典来进行解决,而python当中字典处理这种题型很方便代码实现:class Solution(object): def singleNumber(self, nums): # 直接使用python当中的字典来进行判断是很方便的 counts = collections.Counter(nums) for i in range(len(nums)):原创 2021-12-19 19:46:07 · 604 阅读 · 0 评论 -
leetcode704 --二分查找Java
题目描述:二分查找巧记诗代码实现:class Solution { public int search(int[] nums, int target) { // // 方式一:直接进行遍历 // for (int i = 0; i < nums.length; i++){ // if (nums[i] == target){ // return i; // } //原创 2021-12-19 16:44:41 · 278 阅读 · 0 评论 -
leetcode26/83 -- 删除有序数组中的重复项/删除排序链表中的重复元素Java
题目描述:思路:对于有序序列去重的通用解法使用的是双指针技巧当中的快慢指针技巧慢指针走在后面,快指针走在前面,找到一个不重复的元素就告诉slow并让slow走一步,然后进行"赋值"代码实现:class Solution { public int removeDuplicates(int[] nums) { // 先判断特殊情况 if (nums.length == 0){ return 0; }原创 2021-12-17 15:49:22 · 622 阅读 · 0 评论 -
leetcode226 -- 翻转二叉树Java
题目描述:思路:如何翻转二叉树? 其实就是把二叉树上的每个节点的左右子节点都交换一下。那么如何实现?其实就是遍历二叉树的所有节点,然后对每一个节点实施【交换子节点】的操作代码实现:/** 1. Definition for a binary tree node. 2. public class TreeNode { 3. int val; 4. TreeNode left; 5. TreeNode right; 6. TreeNode() {}原创 2021-12-16 20:25:48 · 1056 阅读 · 0 评论 -
leetcode110 -- 平衡二叉树Java
题目描述:思路:一般的思路:遍历二叉树,对二叉树的每一个节点计算左右的最大高度,但是计算一颗二叉树的最大深度也需要递归遍历这棵树的所有节点,如果对每个节点都计算一遍最大深度,时间复杂度会比较高。比较好的思路:反过来思考,只计算一次最大深度,计算的过程中顺便判断二叉树是否平衡:对于每个节点,先计算出来左右子树的最大高度,然后在后序遍历的位置根据左右子树的最大高度判断平衡性即可。代码实现:/** * Definition for a binary tree node. * public cl原创 2021-12-16 19:44:20 · 1050 阅读 · 0 评论 -
leetcode169 -- 多数元素Java + Python
题目描述:方法一:如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 n/2 向下取整处一定是众数解释: 奇数/偶数个都是符合的代码实现:class Solution { public int majorityElement(int[] nums) { // 方法一:可以从排序以后数据的特点来进行思考 // 先将数组里面的元素进行相应排序,直接使用java内部函数 Arrays.sort(nums);原创 2021-12-15 21:48:05 · 751 阅读 · 0 评论 -
leetcode104 -- 二叉树的最大深度Java
题目描述:方法一:深度优先遍历一般对于树的题目,我们都是可以用到递归的思想如果我们知道了左子树和右子树的最大深度l和r,那么该二叉树的最大深度为 max(l, r) + 1左右子树的最大深度又可以用同样的方式来进行计算代码实现:class Solution { public int maxDepth(TreeNode root) { if (root == null){ return 0; } int left原创 2021-12-12 17:26:13 · 808 阅读 · 0 评论 -
leetcode112 -- 路径之和Java
题目描述:方法一:递归题目其实可以看成是否存在从当前节点root到叶子节点的路径,满足其路径之和为sum从根节点到当前节点的值之和为val,大 -> 小: 是否存在从当前节点的子节点到叶子的路径满足路径之和为 sum - val上面很明显就可以使用到递归的性质:① 当前节点就是叶子节点,直接判断sum是否等于val即可:因为路径和已经确定了,就是当前节点的值,我们只需要判断该路径和是否满足条件即可 ② 若当前节点不是叶子节点,我们只需要递归地询问它的子节点是否满足条件即可代码实现:原创 2021-12-10 22:58:51 · 381 阅读 · 0 评论 -
leetcode69 -- Sqrt(x)Java
题目描述方法一:一种用指数函数exp和对数函数ln代替平方根函数的方法代码实现:class Solution { public int mySqrt(int x) { // 方法一:一种用指数函数exp和对数函数ln代替平方根函数的方法 if (x == 0){ return 0; } int ans = (int)Math.exp(0.5 * Math.log(x)); // 数字可原创 2021-12-10 20:19:35 · 136 阅读 · 0 评论 -
leetcode102 -- 二叉树的层序遍历java
题目描述:思路:层序遍历的一般写法:通过一个while循环控制从上向下一层层遍历,for循环控制每一层从左向右遍历:代码实现:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val原创 2021-12-07 20:01:25 · 518 阅读 · 0 评论 -
leetcode143--重排链表Java
题目描述方法一:简单思路因为链表是不支持下标访问的,所以我们无法随机访问链表中任意位置的元素,利用线性表存储该链表,然后利用线性表可以下标访问的特点直接按照顺序访问指定元素,重新构造链表即可/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) {原创 2021-12-05 20:43:33 · 646 阅读 · 0 评论 -
试写一个generator,不断输出下一行的list,打印出杨辉三角 -- Python
试写一个generator,不断输出下一行的list,打印出杨辉三角练习程序主要部分核心代码 L = [1] while True: yield L L = [L[i] + L[i-1] for i in range(1, len(L))] L = [1] + L + [1]测试运行...原创 2021-12-03 21:45:16 · 462 阅读 · 0 评论