
leetcode算法编程提升
力扣题目解析
KevinBrain
热爱编程!热爱生活!代码改变世界!一枚喜欢研究各种代码技术,对计算机技术充满好奇心的技术宅。
展开
-
力扣题解-数学题类|你可以获得的最大硬币数目
1561. 你可以获得的最大硬币数目2020深信服笔试原题有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币:每一轮中,你将会选出 任意 3 堆硬币(不一定连续)。Alice 将会取走硬币数量最多的那一堆。你将会取走硬币数量第二多的那一堆。Bob 将会取走最后一堆。重复这个过程,直到没有更多硬币。给你一个整数数组 piles ,其中 piles[i] 是第 i 堆中硬币的数目。返回你可以获得的最大硬币数目。示例 1:输入:piles = [2,4,1,2,7,8]输出:9原创 2020-10-11 21:26:06 · 674 阅读 · 0 评论 -
力扣题解-字符串类|字符串转换(编辑)距离
72. 编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例 2:输入:word1 = "i原创 2020-10-11 21:22:24 · 759 阅读 · 0 评论 -
力扣题解-数学题类| 手动实现求平方根sqrt()方法
实现 int sqrt(int x) 函数。2020深信服笔试原题计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。理论基础:牛顿迭代法 牛顿迭代法顾名思义当然是迭代法的一种,所谓迭代法顾名思义就是重复地进行某种运算。进行到何时为止全凭个人喜好,但是理想情况下应该是计原创 2020-10-11 20:38:26 · 619 阅读 · 0 评论 -
力扣题解-数组类| 所有奇数长度子数组的和及数组的所有子序列
5503. 所有奇数长度子数组的和给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。示例 1:输入:arr = [1,4,2,5,3]输出:58解释:所有奇数长度子数组和它们的和为:[1] = 1[4] = 4[2] = 2[5] = 5[3] = 3[1,4,2] = 7[4,2,5] = 11[2,5,3] = 10[1,4,2,5,3] = 15我们将所有值求和得原创 2020-09-20 22:43:14 · 342 阅读 · 0 评论 -
力扣题解-数学题类| 矩形面积及判断是否重叠
836. 矩形重叠矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形,判断它们是否重叠并返回结果。示例 1:输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]输出:true示例 2:输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]输出:false提示:两个矩原创 2020-09-20 21:38:01 · 501 阅读 · 0 评论 -
力扣题解-二叉树类| 二叉树求高度、深度、宽度、判断平衡性等系列问题(java实现)
1、求树的深度(最大深度)树的深度是从根节点到最远叶子节点的最短路径上的节点数量//(递归方式)获取以root为根节点的子树的深度:从叶子节点到达根节点的最长路径public int getDept(TreeNode root, int dept){ if(root == null){ return dept; } int leftDept = getDept(root.left, dept+1); int rightDept = getDept(ro原创 2020-08-21 16:15:41 · 600 阅读 · 0 评论 -
力扣题解-动态规划类| 三种背包问题题解(java实现)
一、 01背包问题描述:给定 N 件物品,物品的重量为 w[i],物品的价值为 c[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?输入:4 102 13 34 57 9输出:12思路:手推dp表如下:import java.util.Scanner;public class Main{ public static void main(String[] args){ Scanner scanner原创 2020-08-20 17:07:18 · 1410 阅读 · 1 评论 -
力扣题解-字符串类| 647. 回文子串
647. 回文子串给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:“abc”**输出:**3**解释:**三个回文子串: “a”, “b”, “c”示例 2:输入:“aaa”**输出:**6**解释:**6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”方法一:动态规划法暴力法主要浪费在判断回文串和字符串切片上,不能有效利用同中心的回文串的状态,简原创 2020-08-19 16:45:18 · 352 阅读 · 0 评论 -
力扣题解-链表类| 面试题 02.01. 移除重复节点(典型链表去重题)
面试题 02.01. 移除重复节点编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决?官方题解://方法一:空间换时间 时O(n) -> 空O(n)class Solution{ public Lis原创 2020-08-04 22:15:10 · 388 阅读 · 0 评论 -
力扣题解-链表类|字符串相加的两类题型解析
典型的字符串相加算法题有两类:一是用链表表示,而是直接用字符串表示。2. 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:**输入:**(2 -> 4 -> 3) + (5 -> 6 -> 4)**输出:**7 -> 0 -> 8**原创 2020-07-25 16:45:29 · 300 阅读 · 0 评论 -
力扣题解| 剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ \2 7/ \ / \1 3 6 9镜像输出:4/ \7 2/ \ / \9 6 31示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 1000题解:二叉树镜像定义: 对于二叉树中任意节点 root ...原创 2020-07-22 16:47:55 · 331 阅读 · 0 评论 -
力扣题解| 1122. 数组的相对排序
1122. 数组的相对排序给你两个数组,arr1和arr2,arr2中的元素各不相同 arr2中的每个元素都出现在arr1中对arr1中的元素进行排序,使arr1中项的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。示例:输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]提示:arr...原创 2020-07-15 17:44:29 · 431 阅读 · 0 评论 -
力扣题解| 1370. 上升下降字符串
1370. 上升下降字符串给你一个字符串s,请你根据下面的算法重新构造字符串:从s中选出最小的字符,将它接在结果字符串的后面。 从s剩余字符中选出最小的字符,且该字符比上一个添加的字符大,将它接在结果字符串后面。 重复步骤 2 ,直到你没法从s中选择字符。 从s中选出最大的字符,将它接在结果字符串的后面。 从s剩余字符中选出最大的字符,且该字符比上一个添加的字符小,将它接在结果字符串后面。 重复步骤 5,直到你没法从s中选择字符...原创 2020-07-15 16:59:06 · 307 阅读 · 0 评论 -
力扣题解| 437 路径总和 III
给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11...原创 2020-07-13 17:00:00 · 285 阅读 · 0 评论 -
力扣题解| 350. 两个数组的交集 II
350. 两个数组的交集 II难度简单331给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。 我们可以不考虑输出结果的顺序。进阶:如果给定的数组已经排好序呢?你将如何优化你的算法? 如原创 2020-07-13 16:25:22 · 430 阅读 · 0 评论 -
力扣题解| 剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4限制:1 ≤ k ≤ 二叉搜索树元.原创 2020-07-09 17:25:03 · 260 阅读 · 0 评论 -
力扣题解| 剑指 Offer 64. 求1+2+…+n
剑指 Offer 64. 求1+2+…+n难度中等157求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出:6示例 2:输入: n = 9输出:45限制:1 <= n<= 10000思路:首先我们梳理一下,这题要求我们不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句,因...原创 2020-07-03 17:11:38 · 398 阅读 · 0 评论 -
力扣题解| 718. 最长重复子数组
718. 最长重复子数组给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。提示:1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100思路及算法暴力解法的过程中,我们发现最坏情况下对于任意 i 与 j ,A[i] 与 B[j] 比较了 \min(i...原创 2020-07-02 17:41:07 · 486 阅读 · 0 评论 -
力扣题解| 500. 键盘行
500. 键盘行给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。示例:输入: ["Hello", "Alaska", "Dad", "Peace"]输出: ["Alaska", "Dad"]注意:你可以重复使用键盘上同一字符。你可以假设输入的字符串将只包含字母。思路:首先编写键盘每一行作为一个Set集合,取给定的每一个字符串,利用Set集合的contains()方法逐个字符比较,如果全部遍历完毕都在该行键盘组成的字符串中,则可以输出,否则.原创 2020-07-01 17:08:34 · 265 阅读 · 0 评论 -
力扣题解| 181. 超过经理收入的员工
181. 超过经理收入的员工SQL架构Employee表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。数据表结构给定Employee表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。测试输出方法一,定义多个表名使用AND:select e1.Name as Employeefrom Employee as e1, Employee as...原创 2020-07-01 15:01:41 · 337 阅读 · 0 评论 -
力扣题解| 292. Nim 游戏
292. Nim 游戏你和你的朋友,两个人一起玩Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。示例:输入: 4输出: false 解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛; 因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。思路:一个找规律的题,挺有意思的:当...原创 2020-06-30 16:12:04 · 564 阅读 · 0 评论 -
力扣题解| 933. 最近的请求次数
933. 最近的请求次数难度简单52收藏分享切换为英文关注反馈写一个RecentCounter类来计算最近的请求。它只有一个方法:ping(int t),其中t代表以毫秒为单位的某个时间。返回从 3000 毫秒前到现在的ping数。任何处于[t - 3000, t]时间范围之内的ping都将会被计算在内,包括当前(指t时刻)的ping。保证每次对ping的调用都使用比之前更大的t值。示例:输入:inputs = ["RecentCou...原创 2020-06-28 15:50:37 · 325 阅读 · 0 评论 -
数据结构| 单链表的实用操作(JAVA实现)
定义链表节点结构:public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }有序单链表的去重:思路:这是一个简单的问题,仅测试你操作列表的结点指针的能力。由于输入的列表已排序,因此我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。public Li原创 2020-06-27 21:32:14 · 210 阅读 · 0 评论 -
力扣题解| 41. 缺失的第一个正数
41. 缺失的第一个正数给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。示例1:输入: [1,2,0]输出: 3示例2:输入: [3,4,-1,1]输出: 2示例3:输入: [7,8,9,11,12]输出: 11,暴力求解首先最容易想到的就是暴力求解,从1开始一个个查找,没找到就直接返回 public int firstMissingPositive(int[] nums) { for (int i = 1...原创 2020-06-27 16:17:14 · 389 阅读 · 0 评论 -
力扣题解| 70. 爬楼梯
70. 爬楼梯假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶动态规划思路和算法我们用 f(x)表示.原创 2020-06-26 20:21:57 · 272 阅读 · 0 评论 -
力扣题解| 69. x 的平方根
69. x 的平方根实现int sqrt(int x)函数。计算并返回x的平方根,其中x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。解法一:class Solution { public int mySqrt(int x) { ...原创 2020-06-26 17:29:26 · 241 阅读 · 0 评论 -
力扣题解| 67. 二进制求和
67. 二进制求和给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字1和0。示例1:输入: a = "11", b = "1"输出: "100"示例2:输入: a = "1010", b = "1011"输出: "10101"提示:每个字符串仅由字符 '0' 或 '1' 组成。 1 <= a.length, b.length <= 10^4 字符串如果不是 "0" ,就都不含前导零。解题方案思路整体思...原创 2020-06-25 21:02:38 · 216 阅读 · 0 评论 -
力扣题解| 66. 加一
66. 加一给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:...原创 2020-06-25 17:54:29 · 315 阅读 · 0 评论 -
力扣题解| 剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列难度简单113收藏分享切换为英文关注反馈输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]结题思路:什么是滑动窗口滑动窗口可以看成数...原创 2020-06-24 17:02:13 · 132 阅读 · 0 评论 -
力扣题解| 1160. 拼写单词
1160. 拼写单词难度简单95收藏分享切换为英文关注反馈给你一份『词汇表』(字符串数组)words和一张『字母表』(字符串)chars。假如你可以用chars中的『字母』(字符)拼写出words中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写(指拼写词汇表中的一个单词)时,chars中的每个字母都只能用一次。返回词汇表words中你掌握的所有单词的长度之和。示例 1:输入:words = ["cat","bt","hat","t...原创 2020-06-24 15:34:12 · 386 阅读 · 0 评论 -
力扣题解| 912. 排序数组
912. 排序数组给你一个整数数组nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[1,2,3,5]示例 2:输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:1 <= nums.length <= 50000 -50000 <= nums[i] <= 50000题解:class Solution { public int[] sortArray..原创 2020-06-21 16:39:19 · 347 阅读 · 0 评论 -
力扣题解| 225. 用队列实现栈
225. 用队列实现栈难度简单187收藏分享切换为英文关注反馈使用队列实现栈的下列操作:push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back,peek/pop from front,size, 和is empty这些操作是合法的。 你所使用的语言也许不支持队列。你可以使用 list 或者 deque(双端队列)来模拟一个...原创 2020-06-21 16:09:08 · 219 阅读 · 0 评论 -
力扣题解| 999. 可以被一步捕获的棋子数
999. 可以被一步捕获的棋子数难度简单72收藏分享切换为英文关注反馈在一个 8 x 8 的棋盘上,有一个白色的车(Rook),用字符'R'表示。棋盘上还可能存在空方块,白色的象(Bishop)以及黑色的卒(pawn),分别用字符'.','B'和'p'表示。不难看出,大写字符表示的是白棋,小写字符表示的是黑棋。车按国际象棋中的规则移动。东,西,南,北四个基本方向任选其一,然后一直向选定的方向移动,直到满足下列四个条件之一:棋手选择主动停下来。 棋子因到达棋盘的边缘而停下。 棋...原创 2020-06-21 15:30:37 · 257 阅读 · 0 评论 -
力扣题解| 169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入: [3,2,3]输出: 3示例2:输入: [2,2,1,1,1,2,2]输出: 2题解:class Solution { //方法一耗时多,容易理解 public int majorityElement(int[] nums) { int major = nums.leng...原创 2020-06-20 20:56:30 · 235 阅读 · 0 评论