- 博客(69)
- 收藏
- 关注
原创 Leetcode 474. 一和零
474. 一和零思路典型的背包不超过容积的变种问题,相比于普通背包多了一维。类比地,这样定义状态f[i,j,k]f[i, j, k]f[i,j,k]: 从前i个字符串中选,0的总数不超过j,1的总数不超过k的选取集合数的最大值。由此可以得到状态转移方程:f[i,j,k]=Math.max(f[i−1,j,k],f[i−1,j−nums[i][0],k−nums[i][1]])f[i, j, k] = Math.max(f[i - 1, j, k], f[i - 1, j - nums[i][0],
2021-06-06 11:56:18 316
原创 Leetcode 92. 反转链表 II
一边扫描,使用伪头节点,好理解!思路涉及到链表,多想想伪头节点来简化特殊判断。开局先扫描,找到left的前面一个节点t,这里也提前给原链表加个dummyHead伪头节点,防止left从1开始翻转。同时记录一下left位置的节点(tail),因为它翻转之后是要连接上后面那段不需要反转的链表的。然后就开始从left开始到right把遍历到的每一个节点使用头插法插入到dummy链表中。这里需要注意使用temp提前拿到下一个节点,否则会被改掉。最后把翻转的链表拼起来就ok了。代码class So
2021-03-18 11:19:21 310
原创 LeetCode 995. K 连续位的最小翻转次数
995. K 连续位的最小翻转次数贪心+模拟初步的想法,从头开始遍历,A[i]碰到0就需要翻转一下从i开始的长度为K的子数组,于是模拟下反转的过程。class Solution { int[] A; int K, n, res; public int minKBitFlips(int[] A, int K) { this.A = A; this.K = K; this.n = A.length; for(int i
2021-02-18 10:58:34 374
原创 LeetCode 1631. 最小体力消耗路径
java两种方法击败50% -> 100%!并查集将所有边从小到大排序,每次拿一条边连接两点,然后判断一下(0,0)(0, 0)(0,0)和(m−1,n−1)(m - 1, n - 1)(m−1,n−1)是否联通,若联通这次加入的边就是最小体力消耗。class Solution { int[] p; int[][] edges; int m, n, N, len; int find(int u){ if(p[u] != u) p[u] = find
2021-01-29 10:39:13 347
原创 springcloud 使用feign多文件上传
springcloud 使用feign多文件上传多文件上传最近项目中遇到的问题,找了很多文档一直不成功。最后终于解决了springcloud间微服务调用时传多个文件的问题。代码pom<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> &
2021-01-24 18:00:33 645
原创 LeetCode 54,59, 885 螺旋矩阵 Ⅰ Ⅱ Ⅲ 一招打遍所有螺旋遍历!
java 一套组合拳打遍所有螺旋遍历!54. 螺旋矩阵题目给定一个包含 mxnm x nmxn 个元素的矩阵(mmm 行, nnn 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]四指针使用四个指针记录当前要遍历的行/列大循环内部:向右:遍历第up行,从left -> right; up++,这一行结束;向下:遍历第righ
2021-01-14 13:30:51 516
原创 LeetCode 204. 计数质数
两种筛法埃氏筛法筛掉所有质数的倍数。每找到一个质数就把它所有的倍数筛掉。class Solution { public int countPrimes(int n) { int[] primes = new int[n + 1]; int cnt = 0; boolean[] st = new boolean[n + 1]; for(int i = 2; i < n; i++){ if(!st[i])
2020-11-17 11:31:58 150 2
原创 LeetCode 922. 按奇偶排序数组 II
java 双指针思路超简单一看就懂双指针iii找第一个不满足偶数位置上放偶数的,jjj找第一个不满足奇数位置上放奇数的,两者换一下,如此重复到末尾即可。因为各占一半,因此当任意一个指针超出范围时,一定就满足了题意。class Solution { public int[] sortArrayByParityII(int[] A) { int i = -2, j = -1, n = A.length; while(i < n && j <
2020-11-12 10:17:17 156
原创 LeetCode 28. 实现 strStr()
java KMP + 字符串哈希两种方法KMPKMP不多说了,先计算next[]next[]next[]数组,再逐个匹配即可。class Solution { public int strStr(String haystack, String needle) { if(needle.length() == 0) return 0; char[] s = haystack.toCharArray(), p = needle.toCharArray();
2020-11-05 10:42:16 106
原创 LeetCode 239. 滑动窗口最大值
java 该用户太懒了,只写了14行代码 简介代码 自己实现双端队列,更加快!双端队列 单调队列典型单调队列题目,保持队列降序,相当于只记录可能作为结果输出的值,这里使用两个变量加一个数组模拟一个简单的双端队列,效率更高!每轮循环:判断队头元素是不是已经超出窗口范围,超出则去掉。将比当前数值小的值全部去掉。插入当前数值。如果当前窗口已经达到了kkk的大小,就开始输出队首元素(当前窗口最大值)。class Solution { int[] q = new int[100010];
2020-11-01 20:02:19 169
原创 LeetCode 901. 股票价格跨度
java单调栈+哨兵超简洁代码 自己的栈效率更高!单调栈+哨兵典型的单调栈题目,一旦来了更大的价格,之前的小价格肯定用不到了,因为本题需要返回持续时间,因此需要记录两个值,一个是价格,一个是来的日期。另外使用哨兵技巧,相当于第一天来了一个无穷大的价格,这样无论后面怎么向前找总会在第0天停下。使用数组加一个指针就可以简单的维护一个栈,可以加速运行时间。class StockSpanner { int[][] stk = new int[2][10010]; int t = 0, da
2020-11-01 17:45:37 231
原创 LeetCode 每日一题 463. 岛屿的周长
java超简单思路,运用哨兵技巧遍历数组遍历数组,对于每个岛屿(为1的格子)检查四周是否是海(为0的格子),如果是海,周长+1+1+1。哨兵:这里为我们的整个海域外圈加一圈海洋,这样可以减少边界的特判。class Solution { public int islandPerimeter(int[][] grid) { if(grid.length == 0) return 0; int n = grid.length, m = grid[0].length,
2020-10-30 13:34:19 181 1
原创 LeetCode 每日一题 1207. 独一无二的出现次数
java击败100%的哈希表方法:用数组代替哈希表普通哈希表使用哈希表,一遍记录,一遍去重,思路简单。class Solution { public boolean uniqueOccurrences(int[] arr) { Map<Integer, Integer> map = new HashMap<>(); for(int num : arr) { map.put(num, map.getOrDefault
2020-10-28 10:04:02 185
原创 LeetCode 每日一题 1365. 有多少小于当前数字的数字
太妙了,只需要五行代码击败100%!计数排序是根据官方题解来的思路,增加了哨兵的运用减少了一次判断 使得代码更加简洁。分为三个步骤遍历数组将每个数的个数记录到countcountcount数组中。哨兵技巧体现在这里,将countcountcount数组多开一位,错一位存储,这样count[i]count[i]count[i]就可以直接表示小于iii的数字数量。遍历countcountcount数组,不断累加,使得count[i]count[i]count[i]表示的是iii之前有多少数字。遍历
2020-10-26 09:44:05 153
原创 LeetCode 每日一题 845. 数组中的最长山脉
java两种方法形象题解,爬山、下山,直接找山顶!击败99%!先爬山,再下山遍历AAA数组,countcountcount记录当前山脉的长度,默认从1开始,山脉必须满足的条件是先上山,再下山:如果A[i]>A[i−1]A[i] > A[i - 1]A[i]>A[i−1]说明现在处于爬山阶段 count++count++count++。如果A[i]<A[i−1]A[i] < A[i - 1]A[i]<A[i−1]并且count!=1count != 1count!
2020-10-25 16:27:11 223
原创 LeetCode 热题 HOT 100 Java题解——148. 排序链表
LeetCode 热题 HOT 100 Java题解148. 排序链表递归+归并复杂度分析迭代+归并复杂度分析148. 排序链表题目:在 O(nlogn)O(n log n)O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序。进阶:你是否可以使用 O(1) 空间解决此题?示例:输入: 4->2->1->3输出: 1->2->3->4示例 2:递归+归并这种方法可以满足时间复杂度的要求,但是由于栈的开销,空间复杂度为O(logn)O(l
2020-10-24 11:38:36 318
原创 LeetCode 热题 HOT 100 Java题解——146. LRU缓存机制
LeetCode 热题 HOT 100 Java题解146. LRU缓存机制哈希表+双向链表复杂度分析146. LRU缓存机制题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「
2020-10-22 14:51:47 300
原创 LeetCode 热题 HOT 100 Java题解——142. 环形链表 II
LeetCode 热题 HOT 100 Java题解142. 环形链表 II数学推导复杂度分析142. 环形链表 II题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明: 不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例:
2020-10-21 20:34:04 300
原创 LeetCode 热题 HOT 100 Java题解——141. 环形链表
LeetCode 热题 HOT 100 Java题解141. 环形链表哈希表复杂度分析快慢双指针复杂度分析141. 环形链表题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返
2020-10-21 12:39:30 320
原创 LeetCode 热题 HOT 100 Java题解——139. 单词拆分
LeetCode 热题 HOT 100 Java题解139. 单词拆分记忆化回溯复杂度分析动态规划复杂度分析139. 单词拆分题目:给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcod
2020-10-21 12:27:13 368
原创 LeetCode 热题 HOT 100 Java题解——136. 只出现一次的数字
LeetCode 热题 HOT 100 Java题解136. 只出现一次的数字位运算复杂度分析136. 只出现一次的数字题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例:输入: [2,2,1]输出: 1位运算同样的数字异或运算两次就为0,因此遍历数组全部异或后剩下的数字就为单个的数字。class Solution { public int si
2020-10-21 10:32:06 227
原创 LeetCode 热题 HOT 100 Java题解——128. 最长连续序列
LeetCode 热题 HOT 100 Java题解128. 最长连续序列哈希表+动态规划复杂度分析并查集复杂度分析128. 最长连续序列题目:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)O(n)O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。哈希表+动态规划本题目要求时间复杂度为O(n)O(n)O(n),因此我们在遍历的过程中查找是否有与当前相连的数字
2020-10-20 18:11:12 349
原创 LeetCode 热题 HOT 100 Java题解——124. 二叉树中的最大路径和
LeetCode 热题 HOT 100 Java题解124. 二叉树中的最大路径和递归复杂度分析124. 二叉树中的最大路径和题目:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例:输入:[-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7输出:42递归 a / \
2020-10-19 16:21:38 258
原创 LeetCode 热题 HOT 100 Java题解——121. 买卖股票的最佳时机
LeetCode 热题 HOT 100 Java题解121. 买卖股票的最佳时机记录历史最低点复杂度分析121. 买卖股票的最佳时机题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意: 你不能在买入股票前卖出股票。示例:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 =
2020-10-19 10:38:52 175
原创 LeetCode 热题 HOT 100 Java题解——114. 二叉树展开为链表
LeetCode 热题 HOT 100 Java题解114. 二叉树展开为链表前驱节点复杂度分析114. 二叉树展开为链表题目:给定一个二叉树,原地将它展开为一个单链表。示例:例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6前驱节点笔者认为本题的关键在于原地,很容易想到的先序
2020-10-19 10:26:52 226
原创 LeetCode 热题 HOT 100 Java题解——105. 从前序与中序遍历序列构造二叉树
LeetCode 热题 HOT 100 Java题解105. 从前序与中序遍历序列构造二叉树递归复杂度分析105. 从前序与中序遍历序列构造二叉树题目:根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7递归先序遍历的第一个元素为根,可以将后
2020-10-18 11:02:27 188
原创 LeetCode 热题 HOT 100 Java题解——104. 二叉树的最大深度
LeetCode 热题 HOT 100 Java题解104. 二叉树的最大深度递归复杂度分析104. 二叉树的最大深度题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。递归当前节点的深度等于左右子树深度最大值+1+1+1,空叶子节点为0
2020-10-18 10:29:29 258
原创 LeetCode 热题 HOT 100 Java题解——102. 二叉树的层序遍历
LeetCode 热题 HOT 100 Java题解102. 二叉树的层序遍历队列广度优先搜索复杂度分析102. 二叉树的层序遍历题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]队列广度优先搜索开局存入rootroot
2020-10-16 17:14:36 232
原创 LeetCode 热题 HOT 100 Java题解——101. 对称二叉树
LeetCode 热题 HOT 100 Java题解101. 对称二叉树递归复杂度分析迭代复杂度分析101. 对称二叉树题目:给定一个二叉树,检查它是否是镜像对称的。示例:例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3进阶:你可以运用递归
2020-10-16 17:01:58 338
原创 LeetCode 热题 HOT 100 Java题解——98. 验证二叉搜索树
LeetCode 热题 HOT 100 Java题解98. 验证二叉搜索树递归复杂度分析中序遍历复杂度分析98. 验证二叉搜索树题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例:输入: 2 / \ 1 3输出: true递归对于每一个节点都需要小于一个上界,大于一个下届,如果递归到当前节点的左子树,那么当
2020-10-16 16:04:07 244
原创 LeetCode 热题 HOT 100 Java题解——96. 不同的二叉搜索树
LeetCode 热题 HOT 100 Java题解96. 不同的二叉搜索树递归子问题复杂度分析记忆化递归复杂度分析动态规划复杂度分析数学方法——卡特兰数复杂度分析96. 不同的二叉搜索树题目:给定一个整数 nnn,求以 1...n1 ... n1...n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / /
2020-10-16 00:00:09 404
原创 LeetCode 热题 HOT 100 Java题解——94. 二叉树的中序遍历
LeetCode 热题 HOT 100 Java题解94. 二叉树的中序遍历迭代中序遍历复杂度分析Morris中序遍历复杂度分析94. 二叉树的中序遍历题目:给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗?迭代中序遍历迭代的思想就是构造一个栈,模拟递归的操作,遍历左边的时候,把一路上的节点存入栈,左边到头后,从栈中取出,加入结果集合
2020-10-15 15:30:31 346
原创 LeetCode 热题 HOT 100 Java题解——84. 柱状图中最大的矩形
LeetCode 热题 HOT 100 Java题解84. 柱状图中最大的矩形暴力解法复杂度分析单调栈复杂度分析单调栈 + 哨兵复杂度分析84. 柱状图中最大的矩形题目:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例:输入: [2,1,5,6,2,3]输出: 10暴力解法对于矩形每一个高度向四周扩散到最大宽度进行计算。javajavajava是可以通过的。class Solution {
2020-10-14 20:53:41 251
原创 LeetCode 热题 HOT 100 Java题解——79. 单词搜索
LeetCode 热题 HOT 100 Java题解79. 单词搜索深度优先搜索回溯复杂度分析79. 单词搜索题目:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。注意:不能使用代码库中的排序函数来解决这道题。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E
2020-10-13 11:12:41 259
原创 LeetCode 热题 HOT 100 Java题解——78. 子集
LeetCode 热题 HOT 100 Java题解78. 子集(1)回溯1复杂度分析(2)回溯2复杂度分析(3)二叉树前序遍历复杂度分析(4)位运算复杂度分析78. 子集题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明: 解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []](1)回溯1递归遍历每
2020-10-13 10:45:31 272
原创 LeetCode 热题 HOT 100 Java题解——76. 最小覆盖子串
LeetCode 热题 HOT 100 Java题解76. 最小覆盖子串双指针滑动窗口+哈希表复杂度分析76. 最小覆盖子串题目:给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。注意:不能使用代码库中的排序函数来解决这道题。示例:输入:S = "ADOBECODEBANC", T = "ABC"输出:"BANC"双指针滑动窗口+哈希表使用两个哈希表,一个记录所需要的字符还需要多少,另一个记录
2020-10-12 23:06:51 314
原创 LeetCode 热题 HOT 100 Java题解——75. 颜色分类
LeetCode 热题 HOT 100 Java题解75. 颜色分类双指针复杂度分析75. 颜色分类题目:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]进阶:一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭
2020-10-11 15:49:17 285
原创 LeetCode 热题 HOT 100 Java题解——72. 编辑距离
LeetCode 热题 HOT 100 Java题解72. 编辑距离自顶向下递归复杂度分析自底向上动态规划复杂度分析72. 编辑距离题目:给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse
2020-10-11 15:37:52 418
原创 LeetCode 热题 HOT 100 Java题解——70. 爬楼梯
LeetCode 热题 HOT 100 Java题解70. 爬楼梯动态规划复杂度分析70. 爬楼梯题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意: 给定 n 是一个正整数。示例:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶动态规划当前第iii个台阶的跳法要么是第i−2i-2i−2个台阶以下跳2个台阶跳过来,要么就是第i−1i-1i−1个台阶跳一步跳过来,
2020-10-10 10:48:02 169
原创 LeetCode 热题 HOT 100 Java题解——64. 最小路径和
LeetCode 热题 HOT 100 Java题解64. 最小路径和动态规划复杂度分析64. 最小路径和题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明: 每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。动态规划因为只能选择向右或者向下走,因此对于每一个方块来说只有两种可能,要么从上面来,要么从
2020-10-10 10:24:02 206
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人