自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode129. 求根到叶子节点数字之和

后if判断形式,很重要。示例 1: 1 / \ 2 3从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 = 25.代码class Solution { public int sumNumbers(TreeNode root) { return helper(root, 0); } public int help

2020-10-31 15:50:40 38

原创 LeetCode1361验证二叉树

方法一:连通性判定我们将验证二叉树的过程分为两步:第一步找到二叉树的根节点,第二步从根节点开始对二叉树进行遍历,判断其是否为一颗有效的二叉树。找根节点在第一步中,为了找到根节点,我们需要用数组 indeg 存放所有节点的入度,这是因为只有入度为 0 的点才能是根节点。我们遍历数组 leftChild 和 rightChild,如果数组中的某个元素 x 不为 -1,那么就表示有一条边指向节点 x,节点 x 的入度 indeg[x] 增加 1。在遍历完数组 leftChild 和 rightChild 后

2020-10-30 10:08:18 101

原创 LeetCode655输出二叉树

二叉树宽度满二叉树定义:一棵深度为k且有2^k-1个结点的二叉树称为满二叉树所以二叉树宽度为2^k-1怎么创建数组 int h = getHeight(root); int w = (1<<h ) -1 ; // 2^h -1 二叉树的最大宽度,也是字符串数组的长度 //从上面可以看出数组列数一定为奇数怎么填写要求将每一个节点填写到数组列数中位数上,也就是二分查找,中间位置,然后递归填写下一行。需要记录左边界left,左边界right,行数,以及

2020-10-28 15:35:47 96

原创 剑指offer判断数组是否满足二叉搜索树的后续遍历

二叉搜索树的后序遍历序列(判断数组是否满足二叉搜索树的后续遍历)明确二叉搜索树定义:左子树中所有节点的值 < 根节点的值;右子树中所有节点的值 > 根节点的值;其左、右子树也分别为二叉搜索树。所以怎么判断一个数组是一个二叉搜索树的后序遍历?从定义出发:左子树所有值小于根节点,右子树所有值大于根节点。方法一,递归根据二叉搜索树的定义,可以通过递归,判断所有子树的 正确性 (即其后序遍历是否满足二叉搜索树的定义) ,若所有子树都正确,则此序列为二叉搜索树的后序遍历。递归解析:终止条件

2020-10-27 23:20:55 112

原创 剑指offer二叉搜索树的最近公共祖先

迭代class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { while(root != null) { if(root.val < p.val && root.val < q.val) // p,q 都在 root 的右子树中 root = root.right; /

2020-10-27 17:42:40 82

原创 从上到下打印二叉树3(之型打印)

双向队列LinkedList<Integer> tmp = new LinkedList<>();//队尾添加元素tmp.addLast(node.val);//队首添加元素tmp.addFirst(node.val);方法一:层序遍历 + 双端队列class Solution { public List<List<Integer>> levelOrder(TreeNode root) { Queue<TreeNo

2020-10-27 17:15:35 148

原创 二叉搜索树与双向链表

排序链表: 节点应从小到大排序,因此应使用 中序遍历 “从小到大”访问树的节点;双向链表: 在构建相邻节点(设前驱节点 pre ,当前节点 cur )关系时,不仅应 pre.right = cur ,也应 cur.left = pre 。循环链表: 设链表头节点 head 和尾节点 tail ,则应构建 head.left = tail 和 tail.right = head 。class Solution { Node pre, head; public Node treeToDou

2020-10-27 12:40:03 101

原创 LeetCode二叉树任务调度

任务调度存在依赖关系,任何一个node节点任务,都依赖于node.left和node.right前置节点任务的完成。所以,这是一个很明显的后序遍历思路。我们以元组的形式return上面的两个条件,格式为:(该结点及子树的最短运行时间, 该结点及子树的最大运行时间)首先,假设不存在多个cpu的情况(即只有一个cpu),要执行完所有的前置任务,那前置任务的总时间肯定是preTime=sum(node.left)+sum(node.right)。这时,我们将preTime看成一个整体。那么现在变成双核CP

2020-10-26 10:54:05 372

原创 LeetCode1365有多少小于当前数字的数字

方法一:暴力class Solution { public int[] smallerNumbersThanCurrent(int[] nums) { int n = nums.length; int[] ret = new int[n]; for (int i = 0; i < n; i++) { int cnt = 0; for (int j = 0; j < n; j++) {

2020-10-26 08:59:11 201

原创 LeetCode845数组中的最长山脉

我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:B.length >= 3存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]一次遍历class Solution { public int longestMountain(int[] A) { int start = -1;

2020-10-25 22:47:10 64

原创 LeetCode89 格雷编码

找规律设 n 阶格雷码集合为 G(n),则 G(n+1)阶格雷码为: 给 G(n) 阶格雷码每个元素二进制形式前面添加 0,得到 G'(n); 设 G(n) 集合倒序(镜像)为 R(n),给 R(n) 每个元素二进制形式前面添加 1,得到 R'(n)class Solution { public List<Integer> grayCode(int n) { List<Integer> res = new ArrayList<Integer&

2020-10-25 10:01:37 90

原创 LeetCode1024视频拼接

方法一:动态规划思路及解法比较容易想到的方法是动态规划,我们令dp[i] 表示将区间 [0,i) 覆盖所需的最少子区间的数量。由于我们希望子区间的数目尽可能少,因此可以将所有 dp[i] 的初始值设为一个大整数,并将 dp[0](即空区间)的初始值设为 0。class Solution { public int videoStitching(int[][] clips, int T) { int[] dp = new int[T + 1]; Arrays.fil

2020-10-24 23:53:41 3647

原创 LeetCode87扰乱字符串

读题在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。说明,字符串相同时,输出true;理解题就是字符串分割,那么怎么分割,当然是每个字符都可以分割,分割之后可以交换判断,其实很简单,但是就是想不出来>_<可以任意位置把字符串分成两部分。这道题很容易想到用递归的思想去解,假如两个字符串 great 和 rgeat。考虑其中的一种切割方式。第 1 种情况:S1 切割为两部分,然后进行若干步切割交换,最后判断两个子树分别是否能变成 S2 的两部分。第

2020-10-24 09:50:44 72

原创 异步与多线程区别

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的.

2020-10-23 10:26:51 2984

原创 什么是多线程,什么是线程安全

什么是进程?电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中的QQ、酷狗播放器、电脑管家等等。什么是线程?进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。所谓串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,

2020-10-23 10:16:22 456

原创 LeetCode85最大矩形

暴力枚举

2020-10-23 09:10:51 79

原创 LeetCode84柱状图中最大矩阵

原始代码我们枚举「高」,我们可以使用一重循环枚举某一根柱子,将其固定为矩形的高度 h。随后我们从这跟柱子开始向两侧延伸,直到遇到高度小于 h 的柱子,就确定了矩形的左右边界。如果左右边界之间的宽度为 w,那么对应的面积为 w * h。class Solution {public: int largestRectangleArea(vector<int>& heights) { int n = heights.size(); int an

2020-10-22 15:30:09 95

原创 二维平面使用回溯法DFS

怎么表示上下左右int [][]dirs={{-1,0},{1,0},{0,-1},{0,1}};题目描述给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。回溯法DFSclass Solution { char [][]board; int m; int n; int [][]dirs={{-1,0},{1,0},{

2020-10-21 16:44:37 128

原创 LeetCode最小覆盖字串

char类型对应整数值范围0~127。初始化数组应该为:int[] window = new int[128];滑动窗口Arrayclass Solution { public String minWindow(String s, String t) { int[] window = new int[128], need = new int[128]; char[] ss = s.toCharArray(), tt = t.toCharArray();

2020-10-21 11:33:28 88

原创 LeetCode74搜索二维矩阵

二维数组与一维数组转换二维数组m行n列,一维数组索引为indexrow = idx // n , col = idx % n。标准二分查找算法class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length; if (m == 0) return false; int n = matrix[0].length; // 二分查找

2020-10-20 21:48:14 67

原创 LeetCode72编辑距离

怎么想到这是动态规划很明显,题目告诉你,字符串可以进行以下三种操作: 插入一个字符; 删除一个字符; 替换一个字符;怎么想到动态规划? 一个字符串可以由子串进行删除,插入,替换。所以这就是动态规划。不要把动态规划想的太麻烦 我们在 A 的末尾添加了一个相同的字符,也就是在A的末尾删除一个字符,那么 D[i][j] 最小可以为 D[i][j-1] + 1; 我们在 B 的末尾添加了一个相同的字符,也就是在A的末尾删除一个字符,那么 D[i][j] 最小可以为 D[i-1][j] + 1;

2020-10-19 20:19:45 338

原创 LeetCode71绝对路径简化

字符串分割和栈应该这样子相爱有一套从天而降的掌法,叫做字符串分割String path;String[] str = path.split("/");有一套从天而降的容器,叫做StackStack<String> stack = new Stack<>();首先定义栈用来存储路径信息,定义字符数组 str 来分隔字符串依次遍历字符数组内容,这里使用增强型 for 循环,如果是 “..” 还要再判断是否为空才能弹出栈如果不为空也不为 “.” 这说明当前元素是路径信息

2020-10-19 17:35:51 72

原创 LeetCode69x的平方根

题目描述实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。不能够for循环遍历//i * i 会溢出int类型int i;for(i = 0;i < x;i++){ if(i * i > x){ break; }}return i;二分法//既然不能够用int类型,我们可以使用long类型,时间复杂度降为O(logx)class Solution {

2020-10-19 17:09:07 409

原创 LeetCode68文本左右对齐

1.先取出一行能够容纳的单词,将这些单词根据规则填入一行2.计算出额外空格的数量 spaceCount,额外空格就是正常书写用不到的空格 2.1除去所有单词的长度3.平均分布:简单来说就是商和余数的计算4.特殊处理 4.1一行只有一个单词,单词左对齐,右侧填满空格 4.2最后一行,所有单词左对齐,中间只有一个空格,最后一个单词右侧填满空格需要填充的空格数量就是词尾空格 + 额外空格,当然最后一个单词的词尾空格不算。具体计算请看下面代码展示。class Solution { pu

2020-10-18 10:50:45 90

原创 折木棍

题目描述在你的面前从左到右摆放着n根长短不一的木棍,你每次可以折断一根木棍,并将折断后得到的两根木棍一左一右放在原来的位置(即若原木棍有左邻居,则两根新木棍必须放在左邻居的右边,若原木棍有右邻居,新木棍必须放在右邻居的左边,所有木棍保持左右排列)。折断后的两根木棍的长度必须为整数,且它们之和等于折断前的木棍长度。你希望最终从左到右的木棍长度单调不减,那么你需要折断多少次呢?用例输入:[3,5,13,9,12]输出:1输入:[3,12,13,9,12]输出:2输入:[3,13,12,9,12

2020-10-17 19:06:12 300

原创 加一

注意坑根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种: 除 99 之外的数字加一; 数字 99。加一得十进一位个位数为 0 加法运算如不出现进位就运算结束了且进位只会是一。所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 1 个位数置为 0,如此循环直到判断没有再进位就退出循环返回结果。然后还有一些特殊情况就是当出现 99、999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。class Solution { publi

2020-10-16 09:47:16 71

原创 剑指offer表示数值的字符串

题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出

2020-10-16 09:22:17 161

原创 0-1背包问题

明确选择和状态初始化,容量为0,物品可供选择为0,总价值为0选择就是每个珠宝是否选择。状态就是dp数组,含义是对于dp[i][j] 放第i件物品对于容量j的最大价值为dp[i][j]。for循环规则,i是 0-m j是 0-npublic class Solution{ int[] vs = {0,2,4,3,7}; int[] ws = {0,2,3,5,5}; Integer[][] results = new Integer[5][11]; @Te

2020-10-16 09:07:12 131 1

原创 LeetCode62不同路径

LeetCode62不同路径一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角问总共有多少条不同的路径?典型的动态规划我们令 dp[i][j] 是到达 i, j 最多路径动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1class Solution { public int uniquePaths(in

2020-10-15 17:58:01 103

原创 康托展开和逆康托展开

简述康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩。设有n个数(1,2,3,4,…,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是在n个不同元素的全排列中, 比当前排列组合小的个数,那么也可以表示当前排列组合在n个不同元素的全排列中的名次(当前的名次 = 比当前排列组合小的个数 + 1)。原理X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!其中, a[i]为整数,并且0 <= a[i] &l

2020-10-15 10:01:47 86

原创 LeetCode57插入区间

LeetCode57插入区间题目描述给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。典型的贪心问题,需要对二维数组起始端点进行排序。注意以下用法:LinkedList<int[]> output = new LinkedList<int[]>(); 可以存储二维数组return output.toArray(new int[output.size()][2]); 可以输

2020-10-14 21:59:54 97

原创 顺时针打印矩阵以及填写矩阵

考察我们对于规律的总结规律就是从左到右,从上到下,从右到左,从下到上,一次循环所以我们应该设置四个变量处理边界。分别是left,right,up,down,当left > right,up> down时,循环结束。class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new LinkedList<>();

2020-10-14 16:13:58 99

原创 LeetCode1002查找常用字符

LeetCode1002查找常用字符字符串操作,双指针,hashmap,数组,动态规划。给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。我们可以依次遍历每一个字符串。当我们遍历到字符串 s 时,我们使用 freq[c] 统计 ss中每一个字符 c 出现的次数。在统计完成之后,我们再将每一个 minfreq[c] 更新为其本身与 freq[c

2020-10-14 14:30:13 74

原创 n皇后状态压缩

class Solution { int n; int[] res; //记录每种方案的皇后放置索引 int count = 0; //总方案数 public int totalNQueens(int n) { this.n = n; this.res = new int[n]; check(0); // 第0行开始放置 return count; } //放置第k行 public voi

2020-10-13 17:33:30 135

原创 快速幂Java模板

递归class Solution { public double quickMul(double x, long N) { if (N == 0) { return 1.0; } double y = quickMul(x, N / 2); return N % 2 == 0 ? y * y : y * y * x; } public double myPow(double x, int n)

2020-10-13 11:59:41 137

转载 LeetCode49字母异位词分组

方法一:排序数组分类map.values 本身是一个集合。注意本题使用的好处。当且仅当它们的排序字符串相等时,两个字符串是字母异位词。class Solution { public List<List<String>> groupAnagrams(String[] strs) { if (strs.length == 0) return new ArrayList(); Map<String, List> ans = ne

2020-10-13 11:20:18 130 1

原创 LeetCode48旋转图像

矩阵转置先看下数学上怎么定义转置矩阵的:将矩阵的行列互换得到的新矩阵称为转置矩阵,转置矩阵的行列式不变。同时转置矩阵有以下的运算性质:方法 1 :转置加翻转最直接的想法是先转置矩阵,然后翻转每一列。这个简单的方法已经能达到最优的时间复杂度O(N^2)。class Solution { public void rotate(int[][] matrix) { int n = matrix.length; // transpose matrix for (int

2020-10-13 10:28:21 197 1

转载 LeetCode41

LeetCode41缺失的第一个正数实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1, N+1] 中。哈希表我们将数组中所有小于等于 0 的数修改为 N+1;我们遍历数组中的每一个数 x,它可能已经被打了标记,因此原本对应的数为 |x|,其中 | | 为绝对值符号。如果 ∣x∣∈[1,N],那么我们给数组中的第 |x| - 1 个位置的数添加一个负号。注意如果它已经有负号,不需要重复添加;class Solution { public int firstMissin

2020-10-10 19:46:09 304

原创 LeetCode36

LeetCode36判断数独是否有效hashset || hashmapclass Solution { private final int N = 9; public boolean isValidSudoku(char[][] board) { HashSet<Integer> [] rows = new HashSet[N]; HashSet<Integer> [] cols = new HashSet[N];

2020-10-08 12:01:07 52

原创 位运算的应用

LeetCode37解数独回溯利用boolean 数组进行标识。当然用hashmap也可以。class Solution { private boolean[][] line = new boolean[9][9]; private boolean[][] column = new boolean[9][9]; private boolean[][][] block = new boolean[3][3][9]; private boolean valid = fals

2020-10-08 11:53:54 130

空空如也

空空如也

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

TA关注的人

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