leetCode算法小抄
文章平均质量分 75
java算法刷题
兴趣使然的CV工程师
摆烂高手
展开
-
22.对于BFS的思考
由两道力扣题来引出此篇内容:算法思路: 开密码锁此题看上去和上题极为相似,其实思路并不相同,第一题其实是提前建立图,然后对图进行bfs搜索得到最短距离,这题如果使用提前建立图的方法,所建立的图的大小拥有10000个节点,可是有些节点我们根本用不到,所以对于此题并没有建图的过程...原创 2022-06-09 10:51:40 · 110 阅读 · 1 评论 -
21.动态规划整理
分成元素和相等的两个部分,首先如果整体和为奇数肯定划分失败,因此需要排除此特殊情况,接下来按照背包问题进行递归分析:当求出half值后,原本问题变成了,能否在数组中找到一组数字,使得他们的值为half,典型的背包问题,dp[i][j]表示,对于arr[0]...arr[i],能否找到一组数字的和刚好为j,写出递推关系:dp[i][j]=dp[i-1][j] or dp[i-1][j-num[i-1]] 表示的是当前状态可以从不选入当前元素和选入当前元素两种选择中继承,但是此条件的成立条件首先是j>=num[原创 2022-06-07 19:34:58 · 181 阅读 · 0 评论 -
拓扑排序
定义给定一个包含n个节点的有向图,给出它的节点编号的一个排列,如果满足对于图中的任意一条有向边(u,v),u的排列都出现在v的前面,则称该排列是图的拓扑排序当图中存在环,那么它不存在拓扑排序 当图是有向无环图,那么它的拓扑排序不止一种对于拓扑排序有dfs和bfs两种方法可以求解例题-课程顺序dfs解法class Solution { // 存储有向图 List<List<Integer>> edges; // 标记每个节点的状态.原创 2022-05-01 20:22:18 · 197 阅读 · 0 评论 -
整理并查集
以一道力扣题来引出这个问题,此题就是查并集的原型问题,如果当问题关注连通团体的数量时,可以使用该算法来解决问题算法包含两个关键的函数和一个关键的parent数组:上级:每个团队里的代表任务,每个团队里有且只有一个,用它来标识整个团队,每个团队的其他元素通过find算法最终都能找到唯一的上级parent数组:对于parent[i]=j,它表示的是对于顶点i,它的上级是j,一般情况下会将它初始化为parent[i]=i,因为每个顶点都至少是自己的上级for (int i = 1; i原创 2022-05-01 18:50:29 · 406 阅读 · 0 评论 -
莫里斯遍历
中序莫里斯迭代 public List<Integer> inorderTraversal(TreeNode root) { if (root == null) { return new ArrayList<>(); } TreeNode cur = root; // 记录当前节点位置 List<Integer> res = new ArrayList<>()原创 2022-04-08 14:47:34 · 417 阅读 · 0 评论 -
二分查找总结
基础二分查找,查找某一个target值循环的终止条件为left=right+1,即所有的区间都搜索完毕int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 while(left <= right) { int mid = left + (right - left) / 2; if(nums[mid] ==原创 2022-01-01 20:04:50 · 856 阅读 · 0 评论 -
力扣1-200刷题总结(5/5)
异位词分组异位词在排序之后它所组成的字符串肯定是一样的,我们可以使用一个哈希表啦存储这样的listpublic List<List<String>> groupAnagrams(String[] strs) { //两个字符串包含的字母相同,所以两个字符串分别进行排序之后得到的字符串一定是相同的 HashMap<String, List<String>> map = new HashMap<>(); .原创 2021-12-27 12:31:31 · 301 阅读 · 0 评论 -
力扣1-200刷题总结(4/5)
链表问题从指定位置反转链表92题要反转这个链表我们至少需要以下几个变量:pre:反转链表段的前一个节点 cur:反转链表的头在while循环中,next先指向还没有发生反转的链表的下一个节点,所以最后next会保存5的位置 public ListNode reverseBetween(ListNode head, int left, int right) { if(left==right)return head; ListNode dummy .原创 2021-12-25 18:42:35 · 312 阅读 · 0 评论 -
力扣1-200刷题总结(3/5)
对称数组问题一般具有对称性质的数组问题可以通过正向遍历和反向遍历两个方式来解决如162题峰值元素和135题分发糖果分发糖果使用Arrays.fill将数组全部初始化为1,正向遍历的时候遍历1到(n-1)的位置,反向遍历的时候遍历(n-2)到0的位置,当当前的数大于上一个数的时候,糖果数量加1,由于题目条件要求满足正向遍历和反向遍历,所以应该取最大值public int candy(int[] ratings) { int[] left = new int[ratings原创 2021-12-23 19:25:14 · 4856 阅读 · 0 评论 -
力扣1-200刷题总结(2/5)
直线上最多的点数量149题两点确定一条直线,如果前两个点分别与第三个点求斜率,若是相等则表明三个点都在一条直线上,运用此方法可以暴力求解public int maxPoints(int[][] ps) { int n = ps.length; int ans = 1; for (int i = 0; i < n; i++) { int[] x = ps[i];//点1 for (int .原创 2021-12-22 19:43:31 · 3974 阅读 · 0 评论 -
力扣1-200刷题总结(1/5)
岛屿问题此类问题概述--求岛屿数量(200),岛屿周长(463),岛屿最大面积(695),最大人工岛屿(827)等等,一般会给一个二维数组1代表陆地,0代表岛屿;然后对岛屿的一些状态进行求解void dfs(int[][] grid, int r, int c) { // 判断 base case if (!inArea(grid, r, c)) { return; } // 如果这个格子不是岛屿,直接返回 if (grid[r][c] !=原创 2021-12-20 22:22:06 · 587 阅读 · 0 评论 -
11.堆
23--合并k个升序的链表public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0)return null; PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() { @Override原创 2021-11-02 21:20:04 · 103 阅读 · 0 评论 -
10.经典面试题
659--分割数组为连续子序列 Map<Integer, Integer> countNum; Map<Integer, Integer> tail; public boolean isPossible(int[] nums) { //用一个哈希表统计每个元素出现的次数 countNum = new HashMap<Integer, Integer>(); for (int num : nums)原创 2021-10-21 21:39:04 · 120 阅读 · 0 评论 -
9.常用的数学运算技巧
常用的位操作1.字符异或后会得到对应的大小写字符2.判断两个数是否为异号3.不使用零时变量交换两个数'd'^' '=='D' int x=1,y=-1;//0被认为是正数 System.out.println((x^y)<0);//true int x=1,y=0; x^=y; y^=x; x^=y;//现在x是0,y是1191--计算1的位数...原创 2021-10-19 17:12:00 · 264 阅读 · 0 评论 -
8.BFS(广度优先)+DFS(深度优先)算法
BFS就是回溯算法,在递归调用之前做选择,在递归调用之后撤销选择,再具体一点就是解决一个决策树的遍历过程,该算法注重三个部分,路径,选择列表和结束条件46--全排列问题 直接画出回溯树,对于当前你的红点来说的话,[1,3]为选择列表,2为路径,结束条件就是到达树的底层所以回溯算法的核心框架为for 选择 in 选择列表: # 做选择 将该选择从选择列表移除 路径.add(选择) backtrack(路径, 选择列表) # 撤销选择 路径.原创 2021-10-12 22:37:56 · 1352 阅读 · 0 评论 -
7.动态规划经典问题
64--最小路径和自顶向下的动态规划解法--备忘录+递归 int[][] memo; public int minPathSum(int[][] grid) { memo=new int[grid.length][grid[0].length]; for (int i = 0; i <grid.length; i++) { Arrays.fill(memo[i],-1); } retur原创 2021-10-10 15:41:31 · 369 阅读 · 0 评论 -
6.动态规划--背包问题和贪心问题
0-1背包问题dp[i][w]表示,对于前i个物品,当背包容量为w的时候,所能获得的最大价值对于是否装第i个物品.有两个状态:如果不装入第i个物品,dp[i][w]=dp[i-1][w]如果装入第i个物品,dp[i][w]=dp[i-1][w-wt[i-1]]+val[i-1]子集背包问题416--分割等和子集转化为背包问题,对数组进行求和,如果能分成等和子集,那么就是求是否能用他的元素凑成sum/2 public boolean canPartition(in.原创 2021-10-08 22:20:26 · 215 阅读 · 0 评论 -
5.动态规划--核心框架和子序列问题
509--斐波那契普通递归的递归树如下,左子树和右子树有相当多的重复部分,这也是递归的低效问题所在(重叠的子问题)带备忘录的递归相当于减去了这一半重叠的子问题,动态规划相当于高中学的数学归纳法,从底到上自己摸索出了一条路线,得到了结果 //普通递归 public int fib(int n) { if(n<=1)return n; return fib(n-1)+fib(n-2); } /////////////////.原创 2021-10-06 10:10:53 · 113 阅读 · 0 评论 -
4.双指针和滑动窗口
操作链表--快慢指针 反转数组,有序数组--左右指针 子串--滑动窗口快慢指针141--给定一个链表判断链表中是否含有环public boolean hasCycle(ListNode head) { ListNode fast=head; ListNode slow=head; while (fast!=null&&fast.next!=null){ fast=fast.next.next;原创 2021-09-29 18:50:38 · 164 阅读 · 0 评论 -
3.数组
870--优势洗牌public static int[] advantageCount(int[] A, int[] B) { int[] sortedA=A.clone(); Arrays.sort(sortedA);//升序排列 int[] sortedB=B.clone(); Arrays.sort(sortedB); //Integer存放B的值,后面的队列存放大于B值的A中的值 HashM..原创 2021-09-28 20:42:04 · 137 阅读 · 0 评论 -
2.二叉树
226-翻转二叉树将每个节点的左右节点进行交换就得到了翻转的二叉树 public static TreeNode reverseTreeDeep(TreeNode treeNode){ if(treeNode==null)return null;//递归的终止条件 //这里是放在了前序遍历的位置,也可以放在后序,放在中序遍历位置是不行的 TreeNode temp=treeNode.left; treeNode.left=.原创 2021-09-16 11:28:12 · 132 阅读 · 0 评论 -
1. 链表专题
算法刷题一定要分类刷,不然就会刷了忘忘了刷刷题顺序:1.数据结构->二叉树->图算法2.动态规划3.动规3.分治原创 2021-09-09 22:09:01 · 237 阅读 · 0 评论