自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 leetcode.90----------子集

解题思路求子集问题本质上是求指定的若干元素的不超固定长度的组合问题,具体来说,就是给你一个数组nums,nums.length=n,每次从nums中取出数目不超过n的元素,求所有的取法,也就是求组合现在问题的关键是nums里有重复元素,如果还是按照78.子集的做法,最后求出来的解集肯定有重复的。所以在dfs之前,需要先对nums排序,排序后nums里相同的元素必定相邻,然后在遍历解空间树的时候,要做一个去重的操作,当遇到重复出现,也就是和前面相邻元素相同的时候,直接跳过该节点,不让它向下递归注意“去重

2020-07-21 21:52:41 125 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 119

原创 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 110

原创 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 89

原创 leetcode 404-------左叶子之和(俩种思路,超详细)

解法一:递归计算二叉树的所有左叶子之和,就是计算二叉树的左子树的所有左叶子之和,加上二叉树的右子树的所有左叶子之和。当遇到一棵树,它的左节点恰好是叶子时,则这棵树的所有左叶子之和,就是这个左叶子结点,加上这棵树的右子树的所有左叶子之和。以上就是递归的主要内容。递归边界就是遇到空树时,返回0,空树所有左叶子之和显然为0。class Solution { public int sumOfLeftLeaves(TreeNode root) { if(root == null)

2020-07-17 21:32:17 184

原创 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 83

原创 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 81

原创 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 136

原创 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 120

原创 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 87

原创 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

原创 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

原创 Mysql的学习总结---------记录第一阶段

数据库三大范式第一范式:确保每一列的原子性,如果每一列都是不可再分的最小数据单元,则满足第一范式第二范式:非主键列必须完全依赖于主键,不能只依赖于主键的一部分。第三范式:非主键列必须只依赖于主键,不能存在传递依赖,不依赖于其他非主键。在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表存储账户权限信息表主要有:u

2020-07-02 23:31:19 89

原创 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 136

原创 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 82

原创 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

原创 Leetcode877.石子游戏(java实现)(普通人的思路)

题目可能确实没有出好,毕竟在一定程度上,我们能够很快地找到其中的“窍门”---->题目中的限制条件是1. 石头的堆数是偶数 2. 石头的总数是奇数,而先手的Alex可以决定Lee是选取奇数编号的石堆或偶数编号的石堆(即先手玩家可以单方面决定他们两个选取石堆的编号的奇偶性),因此Alex在这种条件下是必胜的!return true就可以ac这道题。但是我们也应该明白出题人的用意,进行一般化的分析,用动态规划或其他方式去解决这道问题,并且按照出题人提供的信息,我们最好是能够判断Alex是否能赢,能赢多少

2020-06-27 17:18:46 402

原创 leetcode 56 区间调度-------区间合并问题

首先,需要按照区间的左端点升序排列,之后我们发现(1,3)与(2,6)之间有重合的地方。重合的原因是因为后者的左端点大于前者的右端点,那我们我们就可以更新前者的右端点为后者的右端点。同样的,我们发现(1,5)与(2,3)之间有重合的地方。重合的原因是因为后者的左端点大于前者的右端点,但是我们的右端点不用更新,因为前者的右端点比后者的右端点大。所以我们更新的步骤为:1.按照区间的左端点升序排列2.判断是否后者的左端点小于前者的右端点,如果是,则更新前者的右端点为两者之间右端点大的那个值,如果否,则说明没

2020-06-21 23:08:38 146

原创 对于二维数组,如何用Arrays.sort()进行排序以及理解------通俗易懂,条理清晰

public static void main(String[] args) { int[][] nums = {{5, 0}, {4, 1}, {6, 2}}; //重写Comparator接口里面的compare方法,用Lambda表达式写比较简洁 // 按行从小到大 Arrays.sort(nums, (o1, o2) -> o1[0] - o2[0]); for (int i = 0; i <

2020-06-21 09:20:17 1247

原创 简单易于理解的DFS和BFS解题模板总结

dfs模板dfs出口,不满足条件就退出操作递归,接着进一步DFSprivate 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 202

原创 leetcode二叉树三种非递归遍历方式

二叉树有三种深度遍历的方式,分别是前序,中序和后序,分别对应LeetCode的144,94,145三道题目。三种遍历方式的递归写法都差不多,也比较容易,相信大家都已经烂熟于心了。这里我总结了三种遍历的非递归的写法,下面分别讲三种遍历的解法:Leetdcode 144 前序遍历public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList&lt

2020-06-16 17:46:08 300

原创 leetcode路径总和问题总结DFS

Leetcode 112一般来说关于DFS有两个套路:第一个就是用recursion来完成,这种在理解上着实也不是很简单,但是一旦理解了,起飞!第二个的话就是用stack来完成iteration,会比上面好理解,但是复杂度会稍微差一点。思路:此题就是一个明显的recursion的问题,我们要从root开始,逐步的先往左枝走,如果不满足再倒退回上一个节点,再往右枝走。如果我们遍历的node不是leaf,那么我们就获取val,进而获取我们接下来需要满足的条件:Sum-val.最后每一个node都会

2020-06-15 23:38:45 160

原创 计算机网路TCP相关知识总结

流量控制:tcp使用滑动窗口实现流量控制。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。流量控制分为正常情况下的滑动流量控制机制和存在数据丢失情况下的流量控制接收方发送的确认报文中的窗口字段为0,发送端只好等待对方发来一个“窗口大小”字段值不为 0 的数据段,这时恰好发生数据丢失。TCP 中引入了一个称为“持续计时器”(persistence timer)的定时器。在 TCP 连接的一段收到对端的一个“窗口大小”字段值

2020-05-23 01:42:05 161

原创 学习多线程的一些总结

每个进程都有独立的内存空间地址。每一个线程都有一个独立的程序计数器和方法调用栈。并发问题的源头:缓存导致的可见性问题,线程切换导致的原子性问题,编译优化导致的有序性问题。双重检查创建单例对象(volatile关键字的典型应用):new操作:1.分配一块内存 2.初始化Singleton对像 3.内存的地址赋值给instance变量;线程不安全的原因:发生了初始化,编译优化导致指令重排序,2与3顺序颠倒,如果此时线程B检查instance==null时会发现,已经建过Singlet

2020-05-14 23:46:17 88

原创 Leetcode198-------动态规划

解题思路:典型的动态规划,以下按照标准流程解题。一.状态定义:设动态规划列表 dp ,dp[i] 代表前 i 个房子在满足条件下的能偷窃到的最高金额。二.转移方程:设: 有 n 个房子,前 n间能偷窃到的最高金额是 dp[n] ,前 n-1 间能偷窃到的最高金额是 dp[n-1],此时向这些房子后加一间房,此房间价值为 num ;加一间房间后: 由于不能抢相邻的房子,意味着抢第 n+1间就不能抢第 n间;那么前 n+1间房能偷取到的最高金额 dp[n+1]一定是以下两种情况的 较大值 :1.不抢

2020-05-14 19:57:15 103

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除