算法刷题
ShareBeHappy
ShareBeHappy_Qin
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 10- II. 青蛙跳台阶问题
题目来源leetcode 剑指 Offer分析有 n 个台阶,设 n 个台阶有 dp[n] 种跳法,分情况:青蛙跳 1 个台阶,剩下的 n-1 个台阶有 dp[n-1] 种跳法;青蛙跳 2 个台阶,剩下的 n-2 个台阶有 dp[n-2] 种跳法。由上找到状态之间的关系:dp[n] = d[n-1] + dp[n-2]一直按照这种状态转移下去,直到基准 dp[0]=1、dp[1]=1。解法1)按照上述形式,可以使用递归,即求 dp[n] 就是求 dp[n-1]、dp[n-2]。这里不原创 2021-01-05 22:01:45 · 71 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
题目来源leetcode 剑指 Offer分析原则:前序遍历是从最顶层根节点开始,中序遍历是从最底层左节点开始的。前序遍历得到根节点,中序遍历由前序遍历得到的根节点分为左右子树。假如从树的根节点开始,遍历前序序列直到与中序序列中的第一个元素相等时,遍历得到的节点都为该根节点的最左侧所有节点。之后从最底层开始遍历子树的根节点得到其右子树。总结:前序遍历: 中、左1、左2、…、左n-1、左n、右n。中序遍历: 左n、左n-1、右n、…、左1、中、右。根据前序序列与中序序列的遍历关系,原创 2021-01-07 11:30:10 · 117 阅读 · 0 评论 -
leetcode 面试题 117. 填充每个节点的下一个右侧节点指针 II
面试题 117. 填充每个节点的下一个右侧节点指针 II题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/解题:// 使用常量空间,不是完美二叉树public Node connect(Node root) { if(root == null){ return null; } Node firstNode = nu原创 2021-03-18 23:18:23 · 135 阅读 · 0 评论 -
leetcode 面试题 08.12. 八皇后——回溯
面试题 08.12. 八皇后题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/eight-queens-lcci/解题思路:皇后不能放在同一行、同一列、左上左下右上右下四个方向的任意单位。要找出所以满足要求的摆放位置,需要遍历所有情况(解集),然后筛选出符合要求的解。最简单的思路是采用暴力枚举的思路,但代码相对较复杂;所以采用回溯算法,类似暴力枚举,代码量少。class Solution { // 保存结果 private List原创 2020-10-13 13:17:36 · 174 阅读 · 0 评论 -
leetcode 面试题 16.17. 连续数列——分治算法
面试题 16.17. 连续数列题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/contiguous-sequence-lcci/解题思路:为了使用分治算法而使用分治算法求解:首先考虑如何将一个原问题如何分解为一系列子问题。简单想一下,如果数组中只有一个元素,那最大值直接就求出来了,于是想着将原数组一直分解下去,直到最后只有一个元素。一个数组中元素和最大的连续序列可能是存在数组的左边、也可能是右边,还有一种可能是中间,也只有这三种可能。我们从中原创 2020-10-11 16:57:18 · 280 阅读 · 0 评论 -
leetcode 989. 数组形式的整数加法——数组
989. 数组形式的整数加法题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/add-to-array-form-of-integer/解题思路:该问题是一个技巧性的问题,不看官方解题思路可能很难想到这种方法,以下是对官方解题思路的复述:官方采用逐位相加。首先用数组 A 的最后一位,即对应整数的最低位与整数 K 相加,这样相加后的整数和的最低位就是求解和的最低位,将整数和赋值给K,所以对 K 与 10 进行求余操作得到求解和的最低位。接下来我们原创 2020-09-25 23:23:52 · 140 阅读 · 0 评论 -
leetcode 605. 种花问题——数组
605. 种花问题题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/can-place-flowers/解题思路:原问题分解为子问题 ——》 求解子问题的最优解 ——》 合并子问题最优解得到原问题最优解。本问题种花元素的前后都必须为0。那么此时我们考虑当前元素的点,若当前元素为1,此地不能种花;若当前元素不为1,此时就需要判断该点前后连个元素是否都为0,若是则表示该点可以种花,将其置为1,若不是就向后一位元素继续判断。同样也采用一个计数标志,当计原创 2020-09-23 14:53:01 · 127 阅读 · 0 评论 -
leetcode 665. 非递减数列——数组
665. 非递减数列题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/non-decreasing-array/解题思路:原问题分解为子问题 ——》 求解子问题的最优解 ——》 合并子问题最优解得到原问题最优解。本题简单的分解,可以考虑将连续的三个元素作为一个子问题,判断是否为非递减序列;此时会想到原数组元素没有三个,那么只有一个或两个元素的数组单独拿出来考虑,此时一定可以得到原问题的解,直接返回 true。数组含有三个及以上的元素,每三个元素作原创 2020-09-23 10:31:37 · 171 阅读 · 0 评论 -
leetcode 1402. 做菜顺序 —— 贪心算法
1402. 做菜顺序题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/reducing-dishes/解题思路:做菜顺序可以是任意的,并且可以删除任意道菜。我们就将数组元素进行从小到大排序,最大的元素放在最后面,那么所经历的时间就越大,就能够以最大的方式得到最大的满意度。那么从排序后的最后一个元素开始遍历排序后的数组stisfaction。当遍历第n个元素时,若stisfaction[n-1]>0,则当前元素可以得到更大的满意度;当遍历第n-原创 2020-07-20 23:17:43 · 506 阅读 · 0 评论 -
leetcode 376. 摆动序列 ——贪心算法
376. 摆动序列题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/wiggle-subsequence/解题思路:依次遍历数组中的每一个元素,判断当前元素差值 nums[i]-nums[i-1] 与上一个元素差值 nums[i-1]-nums[i-2] 是否异号,是,则摆动子序列长度加1,并且保存当前元素差值用于与下一个元素差值比较;否,则直接跳过,遍历下一个元素。即使用贪心算法,只要碰到两次差值异号就将摆动子序列的长度加1。代码:publi原创 2020-07-18 22:32:08 · 400 阅读 · 0 评论 -
leetcode 910. 最小差值 II —— 贪心算法
910. 最小差值 II题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/smallest-range-ii/解题思路:这道题的题意是A数组中的每个元素要么加K、要么减K,只能进行其中的一个操作。在每个元素操作完后就构成一个新的数组B,要求使B中数组元素的最大值与最小值的差值最小。对于这道题,我们先来考虑所有情况:假设两个数x、y,且x<y。1、x、y都加K与都减K的结果与原数组A中的最大最小元素的差值一样。算一种情况。原创 2020-07-15 23:19:42 · 446 阅读 · 0 评论 -
leetcode 1326. 灌溉花园的最少水龙头数目 —— 贪心算法
1326. 灌溉花园的最少水龙头数目题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/minimum-number-of-taps-to-open-to-water-a-garden/思路:不关注每个水龙头的覆盖范围,而是考虑该段花园能被哪些水龙头覆盖。 这样从这些水龙头中找到覆盖范围最广的水龙头,于是就可以得到覆盖包括当前花园段的覆盖区间。在这段区间我们不关注哪个点满足这个点,但我们知道这区间当中一定有一个点满足。我们关注跳转到该区间右边界的点。指向原创 2020-07-14 19:35:37 · 487 阅读 · 0 评论 -
leetcode—— 剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和题目:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100代码:public int maxSu原创 2020-07-12 16:30:36 · 103 阅读 · 0 评论 -
leetcode 464. 我能赢吗
464. 我能赢吗题目:在 “100 game” 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者。如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩原创 2020-07-10 20:49:03 · 362 阅读 · 0 评论 -
面试题 08.11. 硬币 —— 动态规划
面试题 08.11. 硬币题目:硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1注意:你可以假设:0原创 2020-07-07 13:06:12 · 357 阅读 · 0 评论 -
leetcode 740. 删除与获得点数 —— 动态规划
740. 删除与获得点数题目:给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入: nums = [3, 4, 2]输出: 6解释: 删除 4 来获得 4 个点数,因此 3 也被删除。之后,删除 2 来获得 2 个点数。总共获得 6 个点数。原创 2020-07-06 16:38:01 · 248 阅读 · 0 评论 -
leetcode 546. 移除盒子 —— 动态规划
将上面记忆化存储的递归算法,改为递推算法。即动态规划法。546. 移除盒子题目:546. 移除盒子给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。当你将所有盒子都去掉之后,求你能获得的最大积分和。示例 1:输入:[1, 3, 2, 2, 2, 3, 4, 3, 1]输出:23解释:[1, 3,原创 2020-07-05 22:44:46 · 524 阅读 · 0 评论 -
leetcode 1139. 最大的以 1 为边界的正方形 —— 动态规划
1139. 最大的以 1 为边界的正方形题目:给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。示例 1:输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输出:9 示例 2:输入:grid = [[1,1,0,0]]输出:1提示:1 <= grid.length <= 1001 <= grid[0].length <= 100原创 2020-07-04 18:38:29 · 301 阅读 · 0 评论 -
leetcode 96. 不同的二叉搜索树 —— 动态规划
96. 不同的二叉搜索树题目:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2原创 2020-07-04 12:49:14 · 99 阅读 · 0 评论 -
leetcode 1144. 递减元素使数组呈锯齿状(双百)
1144、递减元素使数组呈锯齿状题目:给你一个整数数组 nums,每次操作会从中选择一个元素并将该元素的值减少 1。如果符合下列情况之一,则数组 A 就是 锯齿数组:1、每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > …2、或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < …返回将数组 nums 转原创 2020-07-02 15:51:04 · 422 阅读 · 1 评论 -
leetcode 面试题 16.04. 井字游戏,简单快速的解题思路
面试题 16.04. 井字游戏题目:设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" “)中。第一个玩家总是放字符"O”,且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩原创 2020-07-02 10:08:51 · 3418 阅读 · 0 评论 -
leetcode 1343. 大小为 K 且平均值大于等于阈值的子数组数目 —— 滑窗法
leetcode 1343. 大小为 K 且平均值大于等于阈值的子数组数目题目要求:给你一个整数数组 arr 和两个整数 k 和 threshold 。请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。示例 1:输入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4输出:3解释:子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4,5 和 6 。其他长度为 3 的子数组的平均值都小于 4 (thresho原创 2020-07-01 15:02:34 · 292 阅读 · 2 评论 -
二叉树的最近公共祖先
二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释:原创 2020-06-13 17:38:45 · 263 阅读 · 0 评论