- 博客(116)
- 收藏
- 关注
原创 Leetcode93:复原IP地址(回溯算法)
Leetcode93:复原IP地址题目:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘
2022-05-02 15:08:15
324
原创 Leetcode131:分割回文串(回溯算法)
Leetcode131:分割回文串题目:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。思路:回溯算法遍历字符串s,将符合要求的回文串进行分割,存放在一维数组deque当一维数组遍历完,将符合要求的一维数组deque存放到二维数组res代码如下:class Solution { //定义二维数组存放结果集 List<List<String&g
2022-05-02 11:30:19
307
原创 Leetcode1049:最后一块石头的重量II
Leetcode1049:最后一块石头的重量II题目:有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没
2022-05-02 10:30:59
224
原创 Leetcode40:组合总和II(回溯算法)
Leetcode40:组合总和II题目:给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。思路:集合(数组candidates)有重复元素,避免出现重复的组合。去重:同一树层上的“使用过”在candidates[i] == candidates[i - 1]相同的情况下:used[i
2022-05-01 17:04:13
404
原创 Leetcode416:分割等和子集&&Leetcode1305:两棵二叉搜索树中的所有元素
Leetcode416:分割等和子集题目:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。思路:0-1背包问题代码如下:class Solution { public boolean canPartition(int[] nums) { //长度为0或者空数组,不可能分割等和子集 if (nums.length==0||nums==null){ re
2022-05-01 10:36:05
163
原创 《JAVA核心技术卷I(第11版)》第1-4章 复习
第一章 JAVA程序设计概述JAVA“白皮书”的关键术语简单性面向对象面试题:面向过程和面向对象的区别?两者的主要区别在于解决问题的方式不同:面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。举例:完成小明洗衣服任务面向过程:定义洗衣服工具类将小明洗衣服的详细过程一步步定义方法,一步步输出即可。面向对象:首先考虑分成几种类;小明对象对应person类;衣服对象对应clothes类;在主类实例化pers
2022-04-30 21:47:52
640
原创 Leetcode908:最小差值I
Leetcode908:最小差值I 给你一个整数数组 nums,和一个整数 k 。 在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ,其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i ,最多 只能 应用 一次 此操作。 nums 的 分数 是 nums 中最大和最小元素的差值。 在对 nums 中的每个索引最多应用一次上述操作后,返回 nums 的最低 分数 。 思
2022-04-30 19:03:22
382
原创 Leetcode39.组合总和(回溯算法)
Leetcode39.组合总和 题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。
2022-04-30 15:17:43
370
原创 Leetcode17.电话号码的字母组合(回溯算法)
Leetcode17.电话号码的字母组合 题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路:回溯算法 代码如下: classSolution{ //设置全局存储的结果集 res List<String>list=newArrayList<>(); publicList<String&...
2022-04-30 11:28:08
271
原创 leetcode2220:转换数字的最小位翻转次数
题目:一次 位翻转 定义为将数字 x 二进制中的一个位进行 翻转 操作,即将 0 变成 1 ,或者将 1 变成 0 。 比方说,x = 7 ,二进制表示为 111 ,我们可以选择任意一个位(包含没有显示的前导 0 )并进行翻转。比方说我们可以翻转最右边一位得到 110 ,或者翻转右边起第二位得到 101 ,或者翻转右边起第五位(这一位是前导 0 )得到 10111 等等。 给你两个整数 start 和 goal ,请你返回将 start 转变成 goal 的 最少位翻转 次数。 思路: 先
2022-04-30 09:48:21
278
原创 Leetcode216:组合综合III
Leetcode216:组合综合III 题目: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 思路:回溯算法 代码如下: classSolution{//定义全局变量收集结果集 List<List<Integer>>result=newArrayList<>(...
2022-04-27 15:19:42
212
原创 leetcode77:组合(回溯算法)
题目: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路:采用回溯算法; 代码如下: classSolution{ //全局变量收集符合条件结果集 List<List<Integer>>result=newArrayList<>(); //全局变量记录当前所在路径 LinkedList<Integer>pa...
2022-04-27 12:08:26
219
原创 Leetcode1802:有界数组中指定下标处的最大值
Leetcode1802:有界数组中指定下标处的最大值 题目: 给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数): nums.length == n nums[i] 是 正整数 ,其中 0 <= i < n abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1 nums 中所有元素之和不超过 maxSum nums[index] 的值被
2022-04-26 09:16:06
257
原创 Leetcode1800:最大升序子数组和
Leetcode1800:最大升序子数组和 题目: 给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。 子数组是数组中的一个连续数字序列。 已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。 思路:遍历所有子数
2022-04-25 22:08:42
409
原创 Leetcode416:分割等和子集&&Leetcode518:零钱兑换II(动态规划之背包问题)
0-1背包问题 前提知识框架:int dp[][] = new int[n+1][m+1];int dp[0][...] = 0;int dp[...][0] = 0;for i in [1...n]for j in [1...m]//取两种选择的最优解dp[i][w]= max(将重量a价值b的物品装进背包,不将重量a价值b的物品装进背包)return [n][w];代码如下:int knapsa...
2022-04-25 20:19:34
396
原创 Leetcode1143.最长公共子序列&&Leetcode583:两个字符串的删除操作&&Leetcode712:两个字符串的最小ASCII删除和(动态规划)
Leetcode1143.最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 思路:动态规
2022-04-25 15:09:36
108
原创 吉普特 笔试题
题目一: 题目描述:给与多个字符串,判断另一个字符串中是否包含如上字符串之一输入描述: 第一行为数字×( X <=10000),表示需要匹配的字符串数量,接下来 X 行字符串为需要匹配的字符串,每个字符串长度不超过20。 接着一行为数宇 Y ( Y <=10000),表示需要检测的字符串数量,接下来 Y 行字符串为需要检测的字符串,每个字符串长度不超过1000。 所有字符均为小写字母输出描述: 如果匹配结果为包含如上字符串之一,则输出 yes ,否则输出 no示例1输入输...
2022-04-23 21:40:49
562
原创 leetcode53.最大子数组和
题目:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分思路:定义一个dp数组,用于存放从第0个元素到i个元素的最大子数组的最大值; 遍历nums数组,使得dp[i]中的每一个元素均有值,其值代表着从第0个元素到i个元素的最大子数组的最大值; 实现dp[i]存放着从第0个元素到i个元素的最大子数组的最大值的方法,使dp[i-1]+nums[i]与nums[i]比较,取最大值;即从第0个元素到i-1个元素的最大子..
2022-04-23 15:55:07
1065
原创 leetcode72:编辑距离(动态规划)
leetcode72:编辑距离 题目:给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 思路: 使用双指针遍历两个单词; 当两个单词指针指向的字符相同,则两个单词均指向下一个字符; 当两个单词指针指向的字符不同,取进行删除、插入、替换任一种操作后的最优解。 解法1:class Solutio
2022-04-21 19:33:55
1020
原创 百度4.19笔试题目和解题代码
题目一:有n座山每一座山的高度是H[i] 假设当前在i位置,接下来可以进行下面两个操作之一 1.走到相邻的山,代价是 min(0,H[j] - H[i]) 2.发动闪现到任意位置 代价是p 2 <= n <=2e5 0<= p <= 1e9 0 <= H[i] <= 1e9 输入n和p,然后输入H[i] 输出走完所有山的最小代价1.输入6` `5` `100` `1` `3` `0` `10` `100输出72.输入6 3 1 1 10 10
2022-04-20 16:36:54
619
原创 leetcode931.下降路径最小和(动态规划)
leetcode931.下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。
2022-04-17 10:25:40
954
原创 leetcode300.最长递增子序列&&leetcode354.俄罗斯套娃信封问题(动态规划)
leetcode300.最长递增子序列 题目:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 思路: 定义一个dp备忘录数组,该数组的每一个下标对应的值表示从下标开始之前的最长递增子序列的数量。 遍历二层循环,第一层从头开始遍历nums目标数组,第二层遍历从头到第一层的项,如果之前的项
2022-04-16 22:19:50
679
原创 leetcode509:斐波那契数&&leetcode322:零钱兑换(动态规划)
leetcode509:斐波那契数 题目:斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给定 n ,请计算 F(n) 。 思路:斐波那契数是动态规划题目,需要解决重叠子问题 重叠子问题:采用备忘录进行解决,即生成一个数组,记录重叠的数据 (int dp = new i
2022-04-15 21:31:15
194
原创 安装docker容器&&docker容器常用命令&&java Springboot项目打包成jar包并部署到docker容器
Part 1 安装docker容器如果你的系统没有安装docker容器,可以参考以下操作: 确定你的系统操作系统及版本 CentOS7及以上版本 cat /etc/redhat-release 确保你的系统没有安装过docker容器,否则,需要卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ d...
2022-04-15 17:55:44
1155
原创 leetcode654:最大二叉树
leetcode654:最大二叉树 题目:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树 思路:构造一个built函数,返回数组中值最大的为最大二叉树的根节点,继续遍历以根节点为边界的左右两个数组,遍历循环返回的根节点分别为上一个父根节点的左右子树节点
2022-04-15 17:18:26
1440
原创 leetcode116:填充每个节点的下一个右侧节点指针&&leetcode114.二叉树展开为链表
leetcode116:填充每个节点的下一个右侧节点指针 题目:给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 思路:采用遍历的方式,将
2022-04-13 17:46:25
194
原创 leetcode226.翻转二叉树
题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 思路一:利用二叉树遍历,每个节点的前序位置或者后序位置,交换其左右节点的位置。(推荐) class Solution { public TreeNode invertTree(TreeNode root) { traveter(root); return root; } public void traveter(TreeNode root){ ...
2022-04-11 20:01:17
542
原创 leetcode.104二叉树的最大深度
leetcode.104二叉树的最大深度 题目:给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 思路:定义结果变量res和深度变量depth;定义遍历方法 traverse(TreeNode root); traverse(TreeNode root)方法: 如果节点为null,则将res和depth的最大值赋值给res; 在遍历节点前序位置 depth++;
2022-04-11 17:59:40
437
原创 leetcode380.O(1)时间插入、删除和获取随机元素
题目:实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。 bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。 int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素...
2022-04-09 10:25:13
241
原创 leetcode870.优势洗牌
题目:给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。 返回 A 的任意排列,使其相对于 B 的优势最大化。 思路:优势洗牌类似于田忌赛马的策略,用数组A较差的牌匹配数组B最强的牌,从而得到相对于B的优势最大化; 首先将数组A进行升序排序;利用PriorityQueue大顶堆的方法使数组B进行降序排序且不改变原有的数组B的位置; 利用田忌赛马的策略返回结果数组res; 定义left..
2022-04-08 19:35:27
594
1
原创 leetcode528.按权重随机选择
leetcode528.按权重随机选择 题目:给你一个 下标从 0 开始 的正整数数组 w ,其中 w[i] 代表第 i 个下标的权重。 请你实现一个函数 pickIndex ,它可以 随机地 从范围 [0, w.length - 1] 内(含 0 和 w.length - 1)选出并返回一个下标。选取下标 i 的 概率 为 w[i] / sum(w) 。 思路:利用二分查找和前缀和的知识; 声明一个前缀和数组preSum;利用前缀和给数组w的每个下标不同权重的值赋予不同的权重长度,
2022-04-07 10:38:19
530
原创 leetcode54:螺旋矩阵&&leetcode59:螺旋矩阵II(矩阵的螺旋遍历)
leetcode54:螺旋矩阵 题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 思路:首先,定义四个边界变量:upper_bound为上边界;right为右边界(根据要遍历的数组的每一行的数量-1);left_bound为左边界;lower_bound为下边界(二维矩阵的高度-1); 有四种遍历情况: 第一种:当upper_bound<=lower_bound时,从left_bound到right_bound依
2022-04-04 10:55:56
659
原创 Leetcode48.旋转图像(顺时针旋转矩阵)
题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 思路:先对二维矩阵进行镜像的反转,然后再对镜像反转的二维矩阵中的每一行进行反转,即可得到顺时针旋转90度的目标二维矩阵。 class Solution { public void rotate(int[][] matrix) { int n = matrix.l...
2022-04-04 10:51:19
438
原创 Leetcode1109航班预定记录&Leetcode1094拼车(差分数组的应用)
差分数组工具类: 思路:定义一个长度为nums数组长度的差分数组diff[];该数组的第一个元素即diff[0]等于nums[0];从第二个元素起,存放的每一个空间为num[i]-nums[i-1]的差值; 当求数组nums[]从第i个元素到第j个元素均增加val值时(val可正可负);即等价于diff[i]+=val;且当j+1不超过差分数组长度时,diff[j+1]-=val; 最后,利用差分数组的原理,重新返回目标结果数组。 class Difference{ ..
2022-04-03 21:29:22
1086
原创 Leetcode25.k个一组反转链表
25.k个一组反转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。题目:25. K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com) 思路:第一步,实现迭代反转a链表起始节点到b节点区间的反转;第二步,实现满k个为一组链表,进行反转,节点可以不断地前进,当前进到k个节点时,停下,实现第一步的反转,反转后将返回反转后链表的头
2022-03-29 21:43:18
822
原创 Leetcode92.反转链表(反转指定区间的链表节点)
92.反转链表(反转指定区间的链表节点)给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 思路:第一步,实现反转前n个节点的链表;第二步,实现反转left和right区间节点的链表;当left为1时,则为实现反转前n个节点的链表;当left不为1时,则头节点指向下一节点、left的数量-1和right的数量-1;即同步前进(left-1)步,至left==
2022-03-29 21:00:52
820
原创 Leetcode206.反转链表
206.反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。题目:206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com) 思路:首先,使用递归实现链表除头节点外的所有节点的反转;最后,单独处理头节点的反转。 class Solution { public ListNode reverseList(ListNode head) { //此处的是递归的关键之处,将整个链表实现反转除了头节点 i...
2022-03-29 20:20:56
616
原创 Leetcode16.相交链表
16.相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路:将两个单链表相连,当两个相连的链表存在相交节点时,则两个相连的链表存在相同的节点,且相同的节点为所求的相交的初始节点,否则,则返回null public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) {.
2022-03-28 21:19:13
439
原创 Leetcode876.链表的中间节点
876.链表的中间节点给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 题目:876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com) 思路:利用快慢指针,循环遍历当slow节点走一步,fast节点走两步,直到fast为null或fast.next为null条件成立终止循环,返回slow节点则为链表的中间节点。 class Solution { public ListNode mi.
2022-03-28 21:18:11
392
原创 Leetcode19.删除链表中的倒数第n个节点
19.删除链表中的倒数第n个节点给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。题目:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com) 思路:首先找到链表中倒数第n个节点,然后使链表中的第n个节点的下个节点指向其下下个节点 寻找链表中倒数第n个节点方法:准备两个链表指针,当第一个链表先走n步时;然后再让第一个链表从第n+1个节点开始,第二个链表从第1个节点开始,同时向后走;当第一个链表走至终点即其下一节点为null..
2022-03-28 21:15:33
429
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅