伴你如风、护你如影|

xzh-yyds

园龄:3年8个月粉丝:0关注:2

08 2022 档案

leetcode143-重排链表
摘要:重排链表 快慢指针+翻转链表 通过快慢指针找到中间节点,然后将后半段进行翻转,然后与前半段进行拼接。 class Solution { public void reorderList(ListNode head) { if(head == null || head.next == null) ret
19
0
0
leetcode440-字典序的第K小数字
摘要:字典序的第K小数字 字典树 对于给定的最大数n和剩余数字k,维护一个当前的字典树前缀cur,先让k减去最小的数字1,然后计算以cur为开头的字典树的容量。计算得出的字典树的容量大于k,说明k无法容纳整棵字典树,那么就仅仅取一个数(即cur10),更新cur = cur10,缩小字典树的范围,继续以c
13
0
0
leetcode226-翻转二叉树
摘要:翻转二叉树 递归 class Solution { public TreeNode invertTree(TreeNode root) { if(root == null) return root; TreeNode l = invertTree(root.left), r = invertTree
50
0
0
leetcode225-用队列实现栈
摘要:用队列实现栈 class MyStack { LinkedList<Integer> list = new LinkedList<>(); public MyStack() { } public void push(int x) { list.add(x); } public int pop() {
13
0
0
leetcode223-矩形面积
摘要:矩形面积 计算重叠面积 重叠面积计算方法如下:重叠部分如果有的话肯定是一个矩形,这个矩形的左边界是两个矩形的左边界取较大值,右边界是两个矩形的右边界取较小值。上下边界同理。这样可以计算出重叠部分的面积,返回结果为总面积减去重叠部分面积即可。 class Solution { public int c
24
0
0
leetcode222-完全二叉树的节点个数
摘要:完全二叉树的节点个数 递归 class Solution { public int countNodes(TreeNode root) { if(root == null) return 0; return countNodes(root.left)+countNodes(root.right)+1
26
0
0
leetcode97-交错字符串
摘要:交错字符串 dp 定义一个二维的dp数组,表示s1选取 i 个字符和s2选取 j 个字符组成s3的前 i+j 个字符能否成立。 dp递归方程: 如果i == 0 && j == 0,表示没有任何字符,true 如果i == 0,那么dp[i][j] = dp[i][j-1] && s2.charAt
28
0
0
leetcode80-删除有序数组中的重复项 II
摘要:删除有序数组中的重复项 II class Solution { public int removeDuplicates(int[] nums) { int cnt = 0, index = 0; for(int i = 0; i < nums.length; i++){ if(i == 0){ cn
15
0
0
leetcode68-文本左右对齐
摘要:文本左右对齐 模拟 先对所有字符串进行一次遍历,保证每个字符串之间有一个空格,然后对字符串分组,确定字符串的位置。 然后对每一组的字符串分配空格:遍历这一组的字符串长度,计算出剩余的空格总数,并根据空格总数分配出固有的空格和多出来的空格数量,依次添加。 注意:最后一行字符之间只能有一个空格,需要单独
12
0
0
leetcode54-螺旋矩阵
摘要:螺旋矩阵 class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list = new ArrayList<>(); int m = matrix.length, n = matrix[0].
14
0
0
leetcode48-旋转图像
摘要:旋转图像 原地旋转 将正方形的数组切分成一个个圈,然后对这个圈进行移动 class Solution { public void rotate(int[][] matrix) { int n = matrix.length; for(int i = 0; i < n/2; i++){ rotate(
15
0
0
leetcode37-解数独
摘要:解数独 回溯+哈希 使用哈希表记录行、列和块的状态,然后对所有空缺的位置进行0-9的回溯。 class Solution { boolean line[][] = new boolean[9][9]; boolean column[][] = new boolean[9][9]; boolean b
26
0
0
leetcode43-字符串相乘
摘要:字符串相乘 逐位相乘 class Solution { public String multiply(String num1, String num2) { if(num1.equals("0") || num2.equals("0")) return "0"; int m = num1.lengt
15
0
0
leetcode655-输出二叉树
摘要:输出二叉树 DFS class Solution { List<List<String>> res = new ArrayList<>(); int m, n, height; public List<List<String>> printTree(TreeNode root) { height =
19
0
0
leetcode264-丑数 II
摘要:丑数 II 优先队列 维护一个优先队列。先取出最小的数字,将其乘以2、3、5,如果发现没有重复的话就装入优先队列中,需要用到set进行去重。 class Solution { public int nthUglyNumber(int n) { Set<Long> set = new HashSet<
21
0
0
leetcode1224-最大相等频率
摘要:最大相等频率 记录状态 cnt数组记录单个数字出现的次数,sum数据记录某一种次数出现的总和。 遍历数据,对于某一个元素来说,首先将cnt数组该元素的值加一,然后记录这个元素出现次数,更新sum数据,max用于维护最大次数总和。 接下来判断是否需要更新最大的长度,以下情况需要进行更新: 当max =
21
0
0
leetcode62-不同路径
摘要:不同路径 图dp class Solution { public int uniquePaths(int m, int n) { int dp[][] = new int[m][n]; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ i
14
0
0
leetcode55-跳跃游戏
摘要:跳跃游戏 dp 记录能到达的最大路径,然后进行遍历。 如果发现当前的位置已经超过了能到达的最大值,那么表明此处无法到达,返回false。 如果发现当前位置能跳跃到更远的距离,那么更新最大值 class Solution { public boolean canJump(int[] nums) { i
24
0
0
leetcode53-最大子数组和
摘要:最大子数组和 dp 记录当前位置的累加和以及最大子数组和。 遍历数组并累加,如果发现累加和小于0,那么前面累加的东西反而会使得后面的和变小,那么直接丢弃,将累加和清零。 class Solution { public int maxSubArray(int[] nums) { int max = n
11
0
0
leetcode115-不同的子序列
摘要:不同的子序列 dp 维护一个二维dp数组,分别表示s[0:i]和t[0:j]的分配种类。 如果j等于0,由于模式串没有进行匹配,那么对于所有的原串来说,都只有一种匹配方式,所以需要赋值1。 然后进行遍历,如果s[i]和t[j]相同,那么有两种选择,匹配或者不匹配,dp[i][j] = dp[i-1]
26
0
0
leetcode44-通配符匹配
摘要:通配符匹配 dp 和正则匹配方法类似。先去处理边界值为0的情况。dp[0][0] = true,同时让j从0到n开始遍历,如果当前的位置是*,那么dp[0][j] = true,因为可以匹配0个字符,否则表明无法继续零匹配,直接跳出循环。 然后进行二维循环,如果当前的匹配串为,那么有两种选择,匹配之
19
0
0
leetcode10-正则表达式匹配
摘要:正则表达式匹配 dp dp[i][j]表示s[0:i]和p[0:j]是否匹配。 如果i == 0 && j == 0,那么说明两个字符串都没有选择字符,是true 如果j == 0,那么说明匹配串没有字符而原字符串有字符,是false 否则,需要根据字符进行分类讨论(注意:i == 0无法判断是tr
17
0
0
leetcode5-最长回文子串
摘要:最长回文子串 中心扩展法 从中心向两侧扩展,分为两种情况:一种是奇数长度,一种是偶数长度,需要分开讨论。 class Solution { public String longestPalindrome(String s) { int n = s.length(), left = 0, right
6
0
0
leetcode42-接雨水
摘要:接雨水 dp 维护两个dp数组,分别记录左侧和右侧的最大值。当前位置的雨水就是左右两侧最大值的较小值减去当前位置的高度,将所有雨水累加即可得到结果。 class Solution { public int trap(int[] height) { int n = height.length, lef
21
0
0
leetcode32-最长有效括号
摘要:最长有效括号 dp dp[i]表示以i为结尾的有效括号的最大长度,dp转移方程如下: 如果i是)且i-1是(,那么dp[i] = dp[i-2]+2 如果i是)且i-1是),且第i-dp[i-1]-1是(,这样刚好能和第i个字符进行匹配。那么dp[i] = dp[i-dp[i-1]-2] + (i+
21
0
0
leetcode22-括号生成
摘要:括号生成 回溯 回溯过程中记录cnt,cnt是左括号减去右括号的数量。 如果cnt等于0,那么只能用左括号 如果cnt等于n-k,那么说明只有剩余括号位全是右括号才可以将所有左括号匹配,只能用右括号 除此之外,左右括号都可以 class Solution { List<String> list =
18
0
0
leetcode45-跳跃游戏 II
摘要:跳跃游戏 II 前向dp 对于一个数i,从0到i-1进行遍历,如果在这个位置能跳跃到i,那么对i的dp值进行更新。 这种方式时间复杂度为O(n^2),效率很低 class Solution { public int jump(int[] nums) { int n = nums.length, dp
36
0
0
leetcode1302-层数最深叶子节点的和
摘要:层数最深叶子节点的和 BFS 层序遍历树,返回最后一次计算的结果 class Solution { public int deepestLeavesSum(TreeNode root) { List<TreeNode> list = new ArrayList<>(); int start = 0,
13
0
0
leetcode132-分割回文串 II
摘要:分割回文串 II 双重dp 首先需要用dp去记录s中回文子串的信息,找出所有的回文子串,方法如上一题。 然后对子串进行拆分,拆分的时候需要用到dp。 对于下标为i这一点,需要去遍历[0, i]这些部分,找出所有以i点结束的回文子串,计算相应的拆分数量,取较小值。 由于最后返回的是分割数量而不是拆分后
16
0
0
leetcode131-分割回文串
摘要:分割回文串 dp+回溯 先通过dp记录子字符串是否为回文串,dp[i][j]表示从i开始到j结束的字符串是否为回文串。注意,i的遍历要从后往前。 然后从0开始进行dfs。在dfs中,找出所有以k为起始字符的回文子串,然后加入路径中,继续进行dfs,直到k == n为止 class Solution
18
0
0
leetcode91-解码方法
摘要:解码方法 dp 如果当前位置的字符串不等于0,则表明这个字符可以被解码成新字符,dp[i] += dp[i-1] 如果上一个位置的字符串等于1或者2并且与当前字符拼接的数字小于等于26,则表明本字符可以是上一个字符遗留下来的,dp[i] += dp[i-2] class Solution { pub
23
0
0
leetcode87-扰乱字符串
摘要:扰乱字符串 dp dp需要记录s1和s2的起始位置和长度,所以是一个三维dp。 dp[i1][i2][len]表示s1从i1位置开始,s2从i2位置开始,长度为len的两个字符串是否和谐。分为以下几种情况: 如果两个字符串相等,返回true 如果字符串不相等,那么从1到len-1的范围内,找出分割点
23
0
0
leetcode85-最大矩形
摘要:最大矩形 dp+单调栈 对每一层维护本列中形成的最高值height,然后对每一层分别计算最大的矩形。 计算每一层最大矩形的时候,先用单调栈记录小于当前位置的左下标和右下标,矩形面积就是(right[i]-left[i]-1) * height[i] class Solution { public i
18
0
0
leetcode712-两个字符串的最小ASCII删除和
摘要:两个字符串的最小ASCII删除和 dp dp[i][j]代表s1[0:i]和s2[0:j]两个字符串的最小删除值。转移方程如下: 如果i == 0且j == 0,则dp[i][j] = 0 如果i == 0或j == 0,则dp[i][j] = dp[i-1][j]+s1.charAt(i-1)或d
29
0
0
leetcode1175-质数排列
摘要:质数排列 分别找出质数和合数的数量,将两者的阶乘相乘即可 class Solution { public int numPrimeArrangements(int n) { int cnt = 0; for(int i = 2; i <= n; i++){ boolean flag = true;
18
0
0
leetcode690-员工的重要性
摘要:员工的重要性 dfs class Solution { Map<Integer, Employee> map = new HashMap<>(); public int getImportance(List<Employee> employees, int id) { for(Employee e
14
0
0
leetcode1033-移动石子直到连续
摘要:移动石子直到连续 分类讨论 class Solution { public int[] numMovesStones(int a, int b, int c) { if(a > b){int t = a; a = b; b = t;} if(a > c){int t = a; a = c; c =
10
0
0
leetcode1656-设计有序流
摘要:设计有序流 数组遍历 维护一个String数组和一个index下标,如果insert插入的idKey-1==index,则将后续字符串依次输出直到遇到null或index==n为止 class OrderedStream { String arr[]; int index = 0; public O
17
0
0
leetcode1282-用户分组
摘要:用户分组 哈希分类 给每一个组别容量分配一个List,存入哈希表中。遍历数组,将当前下标加入对应数量的List中。 如果List数量满了,那么将其从map中删除并存入返回值。 class Solution { public List<List<Integer>> groupThePeople(int
24
0
0
leetcode636-函数的独占时间
摘要:函数的独占时间 栈 使用栈记录调用过程。如果log为start,那么就加入堆栈。如果是end,则分两种情况: 栈不为空,意味着存在递归调用,那么说明当前的函数占用了上一个函数的使用时间,所以上一个函数要减去相应的时间,然后给当前函数增加时间 栈为空,则直接增加当前函数的时间 class Soluti
14
0
0
leetcode1374-生成每种字符都是奇数个的字符串
摘要:生成每种字符都是奇数个的字符串 模拟 如果n为奇数,则返回n个a;如果n为偶数,则返回n-1个a和1个b class Solution { public String generateTheString(int n) { StringBuffer sb = new StringBuffer(); i
16
0
0
leetcode698-划分为k个相等的子集
摘要:划分为k个相等的子集 回溯+剪枝 首先先判断总和sum能否被整除。然后对数组排序,从后向前遍历。 如果当前的值大于target,表明最大值已经超出范围,直接返回false 如果当前的值等于target,那么直接将其放入bucket中 如果当前的值小于target,需要进行回溯,从当前位置向前回溯即可
24
0
0
leetcode876-链表的中间结点
摘要:链表的中间结点 快慢指针 fast代表快指针,一次走两格;slow表示慢指针,一次走一格。持续遍历直到fast等于null或者fast.next等于null的时候返回slow指针即可 class Solution { public ListNode middleNode(ListNode head)
24
0
0
leetcode341-扁平化嵌套列表迭代器
摘要:扁平化嵌套列表迭代器 递归 对于传入的List<NestedInteger> nestedList,使用迭代器获取NestedInteger,如果当前的数字是Integer,那么直接加入List中;否则,就将取出的链表传入函数中进行递归调用 /** * // This is the interfac
18
0
0
leetcode738-单调递增的数字
摘要:单调递增的数字 贪心算法 先对数字进行遍历,找出从零开始单调递增的子序列。 如果此时i小于数组长度,意味着数组不是全部递增的,需要对数组进行修改。那么让i从后向前进行遍历,每次将arr[i-1]数组减一,直到arr[i] >= arr[i-1]成立为止。将前面的数字减少之后,由于前面的数字已经小于原
14
0
0
leetcode641-设计循环双端队列
摘要:设计循环双端队列 class MyCircularDeque { class ListNode{ int val; ListNode prev, next; public ListNode(){ this.prev = this.next = null; } public ListNode(int
13
0
0
leetcode4-寻找两个正序数组的中位数
摘要:寻找两个正序数组的中位数 二分查找 class Solution { int len1, len2; public double findMedianSortedArrays(int[] nums1, int[] nums2) { len1 = nums1.length; len2 = nums2.
22
0
0
leetcode3-无重复字符的最长子串
摘要:无重复字符的最长子串 滑动窗口 需要记录左边界left。当右边界移动的时候,如果新加入的字符已经存在,那么需要更新左边界,让left取左边界和上一个字符位置的最大值。 之后更新字符的最新位置,同时更新max class Solution { public int lengthOfLongestSub
14
0
0
leetcode2-两数相加
摘要:两数相加 循环,每次相加都new一个新的节点 class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head = null, tail = null; int sum = 0; whil
18
0
0
leetcode1-两数之和
摘要:两数之和 暴力遍历 class Solution { public int[] twoSum(int[] nums, int target) { int n = nums.length; for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++)
18
0
0
点击右上角即可分享
微信分享提示
深色
回顶
展开