- 博客(118)
- 收藏
- 关注
原创 【LeetCode刷题笔记】503.下一个更大元素2
学到了一个求环形数组下标的方法:一般是通过 % 运算符求模(余数)int[] arr = {1,2,3,4,5};int n = arr.length, index = 0;while (true) { print(arr[index % n]); index++;}这道题求两轮数组即可 public int[] nextGreaterElements(int[] nums) { int[] res = new int[nums.length];
2021-07-14 17:07:02
222
原创 【LeetCode刷题笔记Java】437.路径总和3
public class MySolution { public int pathSum(TreeNode root, int targetSum){ // key存放前缀和是几,value存放前缀和为key的有几个 Map<Integer, Integer> prefixSumMap = new HashMap<>(); // 加一个前缀和为0的,代表当前节点,也就是从根节点到根节点的前缀和 prefixSum
2021-07-05 15:57:12
235
原创 【LeetCode刷题笔记Java】124.二叉树中的最大路径和
题目:路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。示例:输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6DFS private int maxValue; public.
2021-07-04 00:26:45
244
原创 【LeetCode刷题笔记Java】114.二叉树展开为链表
题目:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例:输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null,5,null,6]后序遍历自底向上调整左右节点 public void flatten(TreeNode root){.
2021-07-02 14:37:05
168
原创 【LeetCode刷题笔记Java】102.二叉树的层序遍历
题目:示例:本题重点在于怎么把BFS输出的结果变成分层的用map保存层数的方法: public List<List<Integer>> levelOrder(TreeNode root){ List<List<Integer>> res = new ArrayList<>(); if (root == null){ return res; } .
2021-07-01 10:34:59
90
原创 【LeetCode刷题笔记Java】297.二叉树的序列化与反序列化
题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例:输入:root = [1,2,3,null,null,4,5]输出:[1,2,3,null,null,4,5] // 使用先序.
2021-06-28 12:00:33
114
原创 【LeetCode刷题笔记Java】98.验证二叉搜索树
题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例:输入:2/ \1 3输出: true// 利用递归中序遍历// preValue保存上一个遍历过的节点的值,用来与当前节点值做比较public int preValue = Integer.MIN_VALUE;// 为了通过leetcode令人无语的用例,设定一个c.
2021-06-27 15:28:35
165
原创 【LeetCode刷题笔记Java】142.环形链表2
题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部.
2021-06-27 15:26:27
98
原创 【LeetCode刷题笔记Java】138.复制带随机指针的链表
题目:给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么.
2021-06-25 10:38:31
73
原创 【LeetCode刷题笔记Java】86.分隔链表
题目:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。示例:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]利用小数链表与大数链表合并 public ListNode partition(ListNode head, int x){ if (head == null || head.n.
2021-06-24 19:21:51
117
原创 【LeetCode刷题笔记Java】234.回文链表
题目:请判断一个链表是否为回文链表。示例:输入: 1->2->2->1输出: true快慢指针+反转链表 public boolean isPalindrome(ListNode head){ if (head == null || head.next == null) return true;// len保存链表长度O(N) int len = 0; ListNode tem.
2021-06-24 17:36:36
124
原创 【LeetCode刷题笔记Java】42.接雨水
题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。暴力方法 public int trap(int[] height){ int result = 0; for (.
2021-06-24 09:53:56
124
原创 【LeetCode刷题笔记Java】96.不同的二叉搜索树
题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例:输入:n = 3输出:5动态规划 public int numTrees(int n){ int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++){ .
2021-06-23 09:41:22
127
原创 【排序算法Java实现】基数排序
代码:/** * @Description: * 一种多关键字的排序算法,可用桶排序实现。 * 算法思想: * 取得数组中的最大数,并取得位数; * arr为原始数组,从最低位开始取每个位组成radix数组; * 对radix进行计数排序(利用计数排序适用于小范围数的特点) * @Author: chong * @Data: 2021/6/22 3:23 下午 */public class RadixSortTemplate { /** * 基数排序,仅支持非负数.
2021-06-22 16:49:00
75
原创 【排序算法Java实现】计数排序
代码:/** * @Description: * 计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。 * 计数排序基于一个假设,待排序数列的所有数均为整数,且出现在(0,k)的区间之内。 * 如果 k(待排数组的最大值) 过大则会引起较大的空间复杂度,一般是用来排序 0 到 100 之间的数字的最好的算法,但是它不适合按字母顺序排序人名。 * 计数排序不是比较排序,排序的速度快于任何比较排序算法。 * 算法思想: * 找出待排序的数组中最大和最小的.
2021-06-22 15:42:07
74
原创 【LeetCode刷题笔记Java】32.最长有效括号
题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例:输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”滑动窗口简简单单,非常容易理解的滑动窗口思想 public String minWindow(String s, String t){ Map<Char.
2021-06-22 09:15:08
93
原创 【LeetCode刷题笔记Java】79.单词搜索
题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”输出:trueDFS递.
2021-06-21 16:28:07
79
原创 【LeetCode刷题笔记】215.数组中的第k个最大元素
题目:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例:输入: [3,2,1,5,6,4] 和 k = 2输出: 5分治,利用快速排序的思想根据快速排序的思想,确定一个数让其做分割点,左边的数字都比它小或相等,右边的数都比其大。每次分割结束后比较从分割点到最右端的距离,如果相等,就说明分割点右边有k - 1个数字比它更大,那么它就是第k大的数字,如果小于,说明右边比分割点大的数字不足k个,那么第k大的点应该在左.
2021-06-21 14:22:14
104
原创 左程云算法基础第二章:认识O(NlogN)的排序
左程云算法基础第二章:认识O(NlogN)的排序在二分查找等需要把数组进行二等分的操作中,取中点可以采用以下写法mid = left + ((right - left) >> 1)在正常情况下的写法mid = (left + right) / 2,但如果范围太大可能会导致溢出,那么换成right - left就不会溢出。递归函数的递归过程类似一个二叉树的后序遍历归并排序:/** * @Description: * 1.把长度为n的输入序列分成两个长度为n/2的子序
2021-06-20 16:20:21
192
原创 【LeetCode刷题笔记】78.子集
题目:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]回溯 List<List<Integer>> result; public List<List<Integer>> subsets(int[].
2021-06-20 09:43:48
124
原创 【LeetCode刷题笔记】72.编辑距离
题目:给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)动态规划 public int mi.
2021-06-20 09:41:12
69
原创 【LeetCode刷题笔记】75.颜色分类
题目:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]双指针由于只要排序三个数字0、1、2,那么我们最终是要把0放在最左边,2放在最右边(假设0、2都存在)那么就设置两个指针分别指向数组的首位和末尾,这两个指针的作用是用来当遍历到数组中元素等于0或者2的时候.
2021-06-19 14:51:16
132
原创 【LeetCode刷题笔记】70.爬楼梯
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶动态规划由于到达n阶的前一步只有往上爬一层或两层,那么设dp[i]为爬到第i阶时的方法总数,可知dp[i]=dp[i-1]+dp[i-2]是一个斐波那契数列。 public int climb.
2021-06-19 08:56:08
139
原创 【LeetCode刷题笔记】64.最小路径和
题目:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。动态规划因为在当前格上只有可能从上面或者左边走来,因此只用考虑这两个位置上的总和即可。dp[i][j]表示走到第i行第j列的格子的最小路径和只要选择上面或者左边最小值再加上自身就是最小路径和(越界.
2021-06-18 23:30:06
99
原创 【LeetCode刷题笔记】62.不同路径
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例:输入:m = 3, n = 7输出:28动态规划由于机器人每步只能向下或者向右走一步,那么当前位置肯定是从上面或者左面走来的,可能路径也是二者之和。状态方程dp[i][j]代表到达第i行第j列位置上的所有路径可能之和。转移方程dp[i][j] = .
2021-06-17 20:20:53
91
原创 【LeetCode刷题笔记】56.合并区间
题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].排序这道题不多说,需要对各个区间的左端点进行排序,排序好.
2021-06-16 16:07:01
217
原创 【Java】从Arrays.sort方法的源码探究到Comparator比较器的各种写法
Arrays.sort源码(Java8)sort方法中会根据输入的类型以及数组大小来自动选择合适的排序方法,这里主要研究一下sort(T[] a, Comparator<? super T> c)这个方法。这个方法输入一个泛型数组a,以及一个Comparator比较器。 public static <T> void sort(T[] a, Comparator<? super T> c) { if (c == null) {
2021-06-16 16:05:22
419
原创 【LeetCode刷题笔记】55.跳跃游戏
题目:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。贪心算法我们想要知道能否从数组第一个位置开始跳跃到最后的位置上,那么我们采取一种贪心的思想,依次遍历数组,并且保存数组上每个元素上所能到达的最大值。比如数组nums[0]=2.
2021-06-16 09:48:23
271
原创 【LeetCode刷题笔记】53.最大子序和
题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。动态规划状态方程:dp[i]表示数组中到第i位时的最大子序和转移方程:dp[i]的值取决于数组第i位选择加入之前的子序列,还是从它开始重新创建一个子序列,这要看第i位的大小和之前的子序列和加上第i位的大小哪个更大。如果第i位加上了.
2021-06-15 18:19:36
93
原创 【LeetCode刷题笔记】48.旋转图像
题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]四指针轮转交换法维护四个指针指向矩阵的四角,依次原地交换四个元素的位置,再逆时针调整指针位置:有一个规律就是如此交换指针所指的元素之后,得到的这四个指针的所.
2021-06-12 10:37:49
178
原创 【LeetCode刷题笔记】46.全排列
题目:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]回溯+DFS依旧是一道经典的回溯题目,具体过程就不在这里详解了,LeetCode里有一篇题解我觉得写的很不错,可以一看回溯算法入门级详解 + 练习(持续更新) List<List<Integer>> result.
2021-06-11 21:54:40
227
原创 【LeetCode刷题笔记】39.组合总和
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]回溯+剪枝剪枝的目的一是为了减少递归的次数,还要对得到的结果进行去重 .
2021-06-11 09:23:56
93
原创 关于Java按值传递的一个问题
在刷题的过程中发现了这个问题, List<List<Integer>> result = new ArrayList<>(); ArrayList<Integer> temp = new ArrayList<>(); result.add(temp); 问题大概发生在这三步,首先创建了一个ArrayList:result,其中保存的类型也是List;然后创建了List类型的temp,.
2021-06-10 19:56:37
44
原创 【剑指offer刷题笔记】04.二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 target = 20,返.
2021-06-10 14:01:47
75
原创 【剑指offer刷题笔记】3.数组中重复的数字
题目:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3先排序在寻找,时间复杂度O(NlogN)太大利用哈希表保存已经出现过的元素,时间复杂度O(N),空间复杂度O(N),看看能不能把空间复杂度降下来根据题目中数组长度为n,其中的元素都是0~n-1,.
2021-06-10 13:37:20
90
原创 【LeetCode刷题笔记】34.在排序数组中查找元素的第一个位置和最后一个位置
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?示例:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]由于数组是有序的,通过二分查找找到数组中target的左右边界要注意要设置left<=right,并且一定要注意边界条件,防止数组越.
2021-06-10 10:02:43
53
原创 【LeetCode刷题笔记】32.最长有效括号
题目:给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例:输入:s = “(()”输出:2解释:最长有效括号子串是 “()”动态规划 public int longestValidParentheses(String s){ if (s.length() == 0) return 0; int[] dp = new int[s.length()]; int re.
2021-06-10 09:58:02
151
原创 【LeetCode刷题笔记】33.搜索旋转排序数组
题目:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一个整.
2021-06-10 09:05:26
121
原创 【LeetCode刷题笔记】31.下一个排列
题目:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例:输入:nums = [1,2,3]输出:[1,3,2] public void nextPermutation(int[] nums){// 要交换的较小和较大值的数组下标 int smallerIndex = 0; int.
2021-06-09 15:39:57
95
原创 【LeetCode刷题笔记】23.合并k个升序链表
题目:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6朴素的办法:设置一个result节点,依次把数组.
2021-06-09 12:50:41
209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人