![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
柯基仔仔
这个作者很懒,什么都没留下…
展开
-
leetcode.90----------子集
解题思路 求子集问题本质上是求指定的若干元素的不超固定长度的组合问题,具体来说,就是给你一个数组nums,nums.length=n,每次从nums中取出数目不超过n的元素,求所有的取法,也就是求组合 现在问题的关键是nums里有重复元素,如果还是按照78.子集的做法,最后求出来的解集肯定有重复的。所以在dfs之前,需要先对nums排序,排序后nums里相同的元素必定相邻,然后在遍历解空间树的时候,要做一个去重的操作,当遇到重复出现,也就是和前面相邻元素相同的时候,直接跳过该节点,不让它向下递归 注意“去重原创 2020-07-21 21:52:41 · 129 阅读 · 1 评论 -
leetcode.96-------不同的二叉搜索树
解题思路 经典的卡特兰数的实际应用问题,相同数学原理的问题还有:矩阵连乘积问题、凸多边形的三角剖分问题、出栈次序问题、括号匹配问题 首先把卡特兰数的递推式摆这,数学定义请自行百度: f(0)=1,f(1)=1,n>=2时: f(n)= f(0) * f(n-1) + f(1) * f(n-2) + … f(n-2) * f(1) f(n-1) * f(0) 解此递推式得f(n)=C(2n,n)/(n+1)=C(2n,n)-C(2n,n-1) 如果已知递推式,用DP的方法去求f(n)是十分简单的,就好像原创 2020-07-21 21:50:38 · 120 阅读 · 0 评论 -
leetcode.48----------旋转图像
解题思路 阅读题目后可发现要完成这个选择,可以先将矩阵进行转置后在交换列,其中交换操作可以使用矩阵乘法来完成但是这样时间负载率就为O(n^3)不划算,还是使用循环操作来完成更划算 代码如下: class Solution { public void rotate(int[][] matrix) { int n=matrix.length; int tmp=0; //转置 for(int i=0;i<n;i++){ fo原创 2020-07-20 21:37:55 · 111 阅读 · 0 评论 -
leetcode.33-------搜索旋转排序数组
解法 此题难点在于我们不知道哪里是最大值,所以我们没办法用常规的二分法来解决。 思路: 当我们找mid的时候,我们要进行一个对比,对比mid和start对应的数字大小,。如果start对应的数字小,那么意味着,start到mid是上升单调;如果大,mid+1 到 end是上升单调。 然后我们需要判断,目标数在不在我们定的上面这两个范围里面,然后不断更新start和end,但是我们没法处理有重复的数字的情况。 class Solution { public int search(int[] nums, in原创 2020-07-20 21:34:32 · 91 阅读 · 0 评论 -
leetcode 404-------左叶子之和(俩种思路,超详细)
解法一:递归 计算二叉树的所有左叶子之和,就是计算二叉树的左子树的所有左叶子之和,加上二叉树的右子树的所有左叶子之和。 当遇到一棵树,它的左节点恰好是叶子时,则这棵树的所有左叶子之和,就是这个左叶子结点,加上这棵树的右子树的所有左叶子之和。 以上就是递归的主要内容。 递归边界就是遇到空树时,返回0,空树所有左叶子之和显然为0。 class Solution { public int sumOfLeftLeaves(TreeNode root) { if(root == null)原创 2020-07-17 21:32:17 · 184 阅读 · 0 评论 -
leedcode.222----------------完全二叉树结点的个数
解题思路 求出左子树 根节点到叶子节点的高度 以及 右子树 根节点到叶子节点的高度 。比较高度 利用公式求解 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { //思路:原创 2020-07-17 21:26:37 · 85 阅读 · 0 评论 -
Leedcode 814 -----二叉树剪枝
解题思路 相当于不断地把值为0的叶子结点删除; 后序遍历(递归):对于每一个当前结点node; 判断node的子节点的值是否为0, 若node的子节点的值为0, 如果当node的子节点是叶子结点, 则将node的子节点置为null; /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * Tr原创 2020-07-17 21:22:12 · 83 阅读 · 0 评论 -
leetcode15-------三数之和(思路超详细,Java语言)
思路: 由于结果需要不包含重复的三元组。 「不重复」的本质是什么?我们保持三重循环的大框架不变,只需要保证: 第二重循环枚举到的元素不小于当前第一重循环枚举到的元素; 第三重循环枚举到的元素不小于当前第二重循环枚举到的元素。 也就是说,我们枚举的三元组 (a, b, c)(a,b,c) 满足 a≤b≤c,保证了只有 (a, b, c)(a,b,c) 这个顺序会被枚举到, 而(b, a, c)、(c, b, a)等等这些不会,这样就减少了重复。要实现这一点,我们可以将数组中的元素从小到大进行排序,随后使用普通原创 2020-07-09 00:18:59 · 140 阅读 · 0 评论 -
leetcode-------449.序列化和反序列化二叉树(JAVA实现)
思路 普通的二叉树需要两种遍历结果才能固定二叉树,而对于BST,得到BST的前序遍历,根据BST的性质,第一个元素值为根节点,小于根节点的元素为左子树,大于根节点的元素为右子树。 class Codec { // Encodes a tree to a single string. //BST的前序遍历结果 public String serialize(TreeNode root) { if (root == null) return ""; Str原创 2020-07-04 23:25:23 · 128 阅读 · 0 评论 -
leedcode---1361 验证二叉树(并查集的应用)
并查集 如果父节点和子节点已经有共同的祖先,说明会形成环,返回false; 若是子节点已经有父节点了,那直接返回false; 最后判断一下连通分支是不是为1,看看是不是只有一颗树。 class Solution { public: vector<int> p; int N; int f(int i) { while(i!=p[i]) { p[i]=p[p[i]]; i=p[i];原创 2020-07-04 23:21:13 · 88 阅读 · 0 评论 -
leetcode----109 平衡二叉树
解题思路 从顶至底和从底至顶两种解法。从顶至底相对来讲很直观,每个node判断一遍就可以了。从底至顶需要创建一个计算最大高度的方法,如果left和right相差大于1就返回-1。 从顶至底 public boolean isBalanced(TreeNode root) { if(root == null) return true; if(Math.abs(check(root.left)-check(root.right))>1) return false; //判断关键 r原创 2020-07-03 23:55:36 · 102 阅读 · 0 评论 -
leetcode-----108 将有序数组转化为二叉搜索树(超详细注释和举例)
左边一半归左子树,右边一半归右子树 class Solution { public TreeNode sortedArrayToBST(int[] nums) { if(nums.length == 0) return null; return buildFromArray(nums, 0, nums.length); } //把nums中从[begin, end)的数字转换为二叉搜索树 //中间的数字作为根节点,左原创 2020-07-03 23:52:07 · 109 阅读 · 0 评论 -
leetcode617------合并二叉树(俩种不同的思路,DFS与BFS,Java实现)
DFS思路: 遍历二叉树很简单,用前序遍历就可以了,再依次把访问到的节点值相加,因为题目没有说不能改变树的值和结构,我们不用再创建新的节点了,直接将树2合并到树1上再返回就可以了。 需要注意:这两颗树并不是长得完全一样,有的树可能有左节点,但有的树没有。 对于这种情况,我们统一的都把他们挂到树1 上面就可以了 class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if(t1==null || t2==null)原创 2020-07-02 23:29:17 · 140 阅读 · 0 评论 -
Leetcode.203---------移除链表元素(虚拟节点法)java实现
虚拟结点法刷链表类的题,经常会用到,尤其是对与链表头节点的处理,一定要记住! ! ! class Solution { public ListNode removeElements(ListNode head, int val) { ListNode pHead = new ListNode(-1); pHead.next = head; ListNode cur = pHead; while(cur!=null&&cu原创 2020-06-27 22:56:43 · 84 阅读 · 0 评论 -
Leetcode 20--------有效的括号(超简单超好理解的解法)java语言实现
public boolean isValid(String s) { if (s.length() % 2 == 1) // 奇数个字符的字符串 显然无法完成括号匹配 return false; Stack<Character> stack = new Stack<>(); for (int i = 0; i < s.length(); i++) { char theChar = .原创 2020-06-27 22:17:31 · 103 阅读 · 0 评论 -
Leetcode877.石子游戏(java实现)(普通人的思路)
题目可能确实没有出好,毕竟在一定程度上,我们能够很快地找到其中的“窍门”---->题目中的限制条件是1. 石头的堆数是偶数 2. 石头的总数是奇数,而先手的Alex可以决定Lee是选取奇数编号的石堆或偶数编号的石堆(即先手玩家可以单方面决定他们两个选取石堆的编号的奇偶性),因此Alex在这种条件下是必胜的!return true就可以ac这道题。 但是我们也应该明白出题人的用意,进行一般化的分析,用动态规划或其他方式去解决这道问题,并且按照出题人提供的信息,我们最好是能够判断Alex是否能赢,能赢多少原创 2020-06-27 17:18:46 · 402 阅读 · 0 评论 -
leetcode 56 区间调度-------区间合并问题
首先,需要按照区间的左端点升序排列,之后我们发现(1,3)与(2,6)之间有重合的地方。重合的原因是因为后者的左端点大于前者的右端点,那我们我们就可以更新前者的右端点为后者的右端点。同样的,我们发现(1,5)与(2,3)之间有重合的地方。重合的原因是因为后者的左端点大于前者的右端点,但是我们的右端点不用更新,因为前者的右端点比后者的右端点大。 所以我们更新的步骤为: 1.按照区间的左端点升序排列 2.判断是否后者的左端点小于前者的右端点,如果是,则更新前者的右端点为两者之间右端点大的那个值,如果否,则说明没原创 2020-06-21 23:08:38 · 148 阅读 · 0 评论 -
简单易于理解的DFS和BFS解题模板总结
dfs模板 dfs出口,不满足条件就退出 操作 递归,接着进一步DFS private void dfs(int[][] image, int i, int j, int oldColor, int newColor) { int m = image.length, n = image[0].length; // dfs出口,不满足条件就退出 if (i < 0 || i >= m || j < 0 || j >= n || image[i][j] != ol原创 2020-06-19 23:45:21 · 205 阅读 · 0 评论 -
leetcode二叉树三种非递归遍历方式
二叉树有三种深度遍历的方式,分别是前序,中序和后序,分别对应LeetCode的144,94,145三道题目。三种遍历方式的递归写法都差不多,也比较容易,相信大家都已经烂熟于心了。这里我总结了三种遍历的非递归的写法,下面分别讲三种遍历的解法: Leetdcode 144 前序遍历 public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<原创 2020-06-16 17:46:08 · 304 阅读 · 0 评论