![](https://img-blog.csdnimg.cn/803f5e658cc5428dabf308d1a7080b9b.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
记录leetcode
George_Will
这个作者很懒,什么都没留下…
展开
-
最小操作/移动次数使数组元素相等Ⅰ&Ⅱ
LeetCode 记录453.最小操作次数使数组元素相等题意,给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数分析:n-1个元素每次增加1,等价于1个元素,每次减少1class Solution { public int minMoves(int[] nums) { //n-1个数+1,等价于1个数-1 int min = nums[0]; for (int i : nu.原创 2021-10-20 07:22:58 · 256 阅读 · 0 评论 -
Trie(字典树、前缀树)数据结构
前缀树是一种非典的的多叉树,多叉树好理解就是多个分支,非典型则是指前缀树的节点的数据结构与一般的树不同。先上代码,再讲我的理解(对应于LeetCode 208)class Trie { private Node root; public Trie() { root = new Node(); } public void insert(String word) { Node tmp = root; int p.原创 2021-10-19 10:58:18 · 74 阅读 · 0 评论 -
动态规划 单调栈 代码详解 1130.叶值的最小代价生成树
1130.叶值得最小代价生成树给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。(知识回顾:如果一个节点有 0 个子节点,那么该节点为叶节点。)每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/prob.原创 2020-10-21 13:20:24 · 130 阅读 · 0 评论 -
动态规划 求矩阵区域和 代码详解
–1314. 矩阵区域求和给你一个 m * n 的矩阵 mat 和一个整数 K ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:i - K <= r <= i + K, j - K <= c <= j + K(r, c) 在矩阵内。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/matrix-block-sumclass Solution原创 2020-10-15 13:47:27 · 259 阅读 · 0 评论 -
代码注释详解 判断是否是子树 剑指Offer26. 树的子结构
剑指Offer26. 树的子结构输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcofclass Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { .原创 2020-10-14 11:30:02 · 123 阅读 · 0 评论 -
回溯 动态规划(0-1背包问题) 优化动态规划 416. 分割等和子集
416.分割等和子集给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-equal-subset-sum1、回溯 (会超时)class Solution { public boolean canPartition(int[] nums) {//0-1背包问.原创 2020-10-11 12:53:08 · 252 阅读 · 1 评论 -
树上DP 代码注释 834.树中距离之和
834.树中距离之和给定一个无向、连通的树。树中有 N 个标记为 0…N-1 的节点以及 N-1 条边 。第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。返回一个表示节点 i 与其他所有节点距离之和的列表 ans。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-distances-in-tree/solution/shu-zhong-ju-chi-zhi-he-by-leetcode-solution转载 2020-10-06 09:30:21 · 130 阅读 · 0 评论 -
设计 [循环队列] 以及 [循环双端队列] 代码
循环队列class MyCircularQueue { int[] queue; int front; int rear; int capacity; /** Initialize your data structure here. Set the size of the queue to be k. */ public MyCircularQueue(int k) { capacity = k + 1; queue = ne原创 2020-10-05 12:08:02 · 81 阅读 · 0 评论 -
滑动窗口 双队列实现 代码注释 剑指Offer59-I. 滑动窗口的最大值
–剑指Offer59-I. 滑动窗口的最大值-给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。来源:LeetCodepublic int[] maxSlidingWindow(int[] nums, int k) { if (nums == null || nums.length == 0){ return new int[0]; } int[] res = new int[nums.length - k + 1];原创 2020-10-05 10:52:47 · 77 阅读 · 0 评论 -
代码详注 132. 分割回文串Ⅱ
132.分割回文串Ⅱ给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的最少分割次数。点击挑战leetcodepublic int minCut(String s) { int n = s.length(); //1. 为了降低时间复杂度,所以提前用动态规划求出s中的回文子串 //1.1 isPalindrome[i][j]=x,表示为区间[i,j]的子串是否是回文串 boolean[][] isPalindrome = new bo.原创 2020-09-23 13:15:05 · 71 阅读 · 0 评论 -
啥叫并查集啊(战术后仰) 由定义到应用带你团灭并查集 (含例题和详细注释)
引用Wikipedia 对并查集的定义在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个用于此数据结构的操作:Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。Union:将两个子集合并成同一个集合。由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(union-find data structure)或合并-查找集合(merge原创 2020-09-17 11:10:18 · 150 阅读 · 0 评论 -
尽量详解 474.一和零 、377.组合总和IV
动态规划题的基本模板private void dp(int m,int n){ //1.状态:xxxx; 选择:xxxx //2.dp[i][j]=val,i表示xx,j表示xx,val表示xx //3.初始条件 //状态转移 for (状态一) { for (状态二){ for(选择){ //4.状态转原创 2020-09-14 19:48:54 · 174 阅读 · 0 评论 -
两种回溯方式求解 77.组合
77.组合给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。LeetCodehttps://leetcode-cn.com/problems/combinations/List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> combine(int n, int k) { if(n <= 0 || k <=.原创 2020-09-08 07:23:53 · 118 阅读 · 0 评论 -
347.前K个高频元素
347.前K个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。LeetCodehttps://leetcode-cn.com/problems/top-k-frequent-elements/现用 HashMap计数,再用PriorityQueuepublic int[] topKFrequent(int[] nums, int k) { HashMap<Integer,Integer> map = new HashMap<>(); .原创 2020-09-07 07:52:18 · 83 阅读 · 0 评论 -
规律题 60.第k个排列
60.第k个排列给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutation-sequence乍.原创 2020-09-05 10:20:48 · 144 阅读 · 0 评论 -
两种解法代码 (KMP、Manacher) 214.最短回文串
以下代码参考自:https://leetcode-cn.com/problems/shortest-palindrome/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–44/214.最短回文串给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。来源:LeetCode网址:https://leetcode-cn.com/problems/shortest-palindro.转载 2020-08-29 12:13:07 · 196 阅读 · 0 评论 -
回溯+贪心 代码注释(Java)322.重新安排行程
332.重新安排行程给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。说明:如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前所有的机场都用三个大写字母表示(机场代码)。假定所有机票至少存在一种合理的行程。.原创 2020-08-27 11:32:25 · 145 阅读 · 0 评论 -
代码注释(递归枚举+剪枝) 491.递归子序列
491.递归子序列给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。来源:LeetCode网站:https://leetcode-cn.com/problems/increasing-subsequences/版本一:递归枚举+Set去重 /** * 算法一:递归枚举 * 思路:每一个位置的数,选择或不选择 */ Set<List<Integer>> set = new HashSet<.原创 2020-08-25 23:38:29 · 153 阅读 · 0 评论 -
递归 面试题17.12.BiNode
面试题17.12.BiNode二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。返回转换后的单向链表的头节点。注意:本题相对原题稍作改动来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binode-lcci/*** 根 右 左*/TreeNode pre =.原创 2020-08-23 22:50:25 · 86 阅读 · 0 评论 -
暴力递归枚举算法 之 24点游戏
679.24点游戏你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。来源:LeetCode地址:https://leetcode-cn.com/problems/24-game/思想:(1)第一次从列表中随意取出两个数,做四则运算后再放回列表,即从4个数变成3个数。(2) 从剩下三个数中,任取两个数,做四则运算后放回,即从3个数变成2个数。(3)将两个数进行四则运算,如果结果是24±1e-6,则表明找到24点,反之没找到代码:pu.原创 2020-08-22 22:24:10 · 538 阅读 · 0 评论 -
根据先序和中序序列 还原二叉树 递归 剑指Offer 07.重建二叉树
剑指Offer 07.重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。来源:LeetCode网址:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder == null || inorder == null ||.原创 2020-08-19 12:25:57 · 146 阅读 · 0 评论 -
两种算法 647.回文子串 (动态规划、中心扩散)
647.回文子串给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。来源:LeetCode网址:https://leetcode-cn.com/problems/palindromic-substrings/动态规划dp[i][j]=x,表示在区间i,j的子串,是否为回文public int countSubstrings(String s) { if(s == null || s.lengt.原创 2020-08-19 08:39:25 · 114 阅读 · 0 评论 -
看懂快慢指针系列 之 以LeetCode 455.分发饼干、141.环形链表、142.环形链表Ⅱ、125.验证回文串、109.有序链表转换为二叉搜索树 为例
1)109.有序链表转换为二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-treepublic TreeNode sortedListToBST(ListNode head) { if(h.原创 2020-08-18 09:55:51 · 122 阅读 · 0 评论 -
异或^和与非&~的使用 136.只出现一次的数字 137.只出现一次的数字Ⅱ
以下内容均参考至LeetCode评论区的大佬们136.只出现一次的数字https://leetcode-cn.com/problems/single-number/public int singleNumber(int[] nums) { //1. a ^ 0 = a //2. a ^ b ^ c = a ^ c ^ b //3. a ^ a = 0 int ans = 0; for(int i = 0;i < nums.length;i++).转载 2020-08-17 14:20:34 · 191 阅读 · 0 评论 -
DFS、双向BFS 127.单词接龙
127.单词接龙DFS(超时) /** * 算法一:暴力回溯 * 超时!! * */ /** * * @param beginWord:src 字符串 * @param endWord:des 字符串 * @param wordList:字典 * @return 转换序列长度,即转换次数+1 */ static boolean[] isVisited; public static.原创 2020-08-17 10:08:16 · 101 阅读 · 0 评论 -
AVL树的判定 110.平衡二叉树
110.平衡二叉树/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean isBalanced(TreeNode root) { .原创 2020-08-17 08:04:55 · 65 阅读 · 0 评论 -
递归 733.图像渲染
733.图像渲染public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { if (sr < 0 || sc < 0 || sr >= image.length || sc >= image[0].length || image[sr][sc] == newColor) return image; int ori = image[sr][sc]; image[sr][s.原创 2020-08-16 10:18:44 · 70 阅读 · 0 评论 -
124.二叉树中的最大路径 beat 99.86%
124.二叉树中的最大路径和class Solution { /** *思想,自底向上,原地修改每个节点,修改为经过节点的最大路径和 *前提:每个节点(除了始末节点)都有两个分支,与其根相连、与其左子树相连、与其右子树相连(三选二) *所以,选择策略就是就可以分为两个,(1)选择左右子树中最大的那条路径,然后与其根相连;(2)同时选择其左右子树路径形成最长路径 *全局变量MAX就来记录最长路径 */ int MAX = Integer.原创 2020-08-16 10:16:34 · 73 阅读 · 0 评论 -
125.验证回文串 栈、双指针
125.验证回文串代码/** (11ms) *算法一:栈 */public boolean isPalindrome(String s) { if(s == null || s.length() == 0) return true; Stack<Character> stack = new Stack<>(); List<Character> list = new ArrayList<>(); for (int i.原创 2020-08-15 06:37:26 · 110 阅读 · 0 评论 -
120.三角形最小路径和 (从dfs+记忆化到动态规划dp)
120.三角形最小路径和dfs+记忆化/**(超时)* 算法一:dfs+备忘录 (自顶向下)*/public int minimumTotal(List<List<Integer>> triangle) { if (triangle == null || triangle.size() == 0) return 0; return BT(triangle,1,triangle.get(0).get(0),0,new HashMap<int[],Inte.原创 2020-08-14 13:08:31 · 134 阅读 · 0 评论 -
杨辉三角 118.杨辉三角 119.杨辉三角Ⅱ(数学解法)
118.杨辉三角public List<List<Integer>> generate(int numRows) { if (numRows == 0) return new ArrayList<>(); List<List<Integer>> list = new ArrayList<>(); //特殊处理一下第一行 List<Integer> tmp = new ArrayList&.原创 2020-08-14 10:27:08 · 119 阅读 · 0 评论 -
括号匹配 20.有效的括号
20.有效的括号代码public boolean isValid(String s) { if (s == null || s.length() == 0) return true; if (s.length() % 2 != 0) return false; //栈 Stack<Character> stack = new Stack(); char ch; for (int i = 0;i < s.length();i++){ .原创 2020-08-14 08:23:33 · 96 阅读 · 0 评论 -
模拟手算 415.字符串相加 43.字符串相乘
415.字符串相加代码public String addStrings(String num1, String num2) { StringBuilder sb = new StringBuilder(); int i = num1.length()-1,j = num2.length()-1,tmp = 0; while (i >= 0 || j >=0 || tmp > 0) { if (i >= 0) tmp += num1.ch.原创 2020-08-14 07:53:30 · 67 阅读 · 0 评论 -
位操作 n&(n-1) LeetCode191.位1的个数、231.2的幂、461.汉明距离
参考至labuladong的博客https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/chang-yong-de-wei-cao-zuo191.位1的个数public int hammingWeight(int n){ int cnt = 0; while(n != 0){ n = n&(n-1); cnt++; } return cnt;}...转载 2020-08-11 10:40:08 · 63 阅读 · 0 评论 -
一道题秒杀DFS、BFS LeetCode130.被围绕的区域
130.被围绕的区域BFS解法/** * 7ms * 思想一: 先对四周的O进行BFS,将O标记为N,然后再遍历一遍整个二维数组,将O变成X,把N变成O */public void solve(char[][] board){ if (board == null || board.length == 0 || board[0].length == 0) return; //Step1 遍历四周,把对O进行BFS并标记 Queue<int[]> queue .原创 2020-08-11 09:51:30 · 85 阅读 · 0 评论 -
一个模板搞定滑动窗口 632.最小区间
更多滑动窗口的例题见我之前的博客632.最小区间public static int[] smallestRange(List<List<Integer>> nums){ if(nums == null || nums.size() == 0) return new int[2]; int minVal = Integer.MAX_VALUE,maxVal = Integer.MIN_VALUE; Map<Integer,List<Intege.原创 2020-08-11 08:40:08 · 88 阅读 · 0 评论 -
一个套路搞定动态规划之 115.不同的子序列
115.不同子序列对于这一类字符串的题都可以考虑用动态规划来解决。求解动态规划,记住4个步骤:1)确定状态和选择2)确定dp数组的含义3)确定dp数组初始条件4)确定状态转移条件那么,来看看这题1)状态:指向字符串t和s的指针位置;选择:是否移动当前指针2)dp[i][j]=x,表示字符串t前i个字符在字符串s前j个字符中有几种匹配情况3)初始条件,当t串为空串,则在s串中无论是前几个字符,匹配情况都只有一种(就是当s串也是空串的时候)4)状态转移条件i)情况一例如,.原创 2020-08-10 23:44:31 · 140 阅读 · 0 评论