LeetCode
LeetCode
鹿谷門実
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 59 - I. 滑动窗口的最大值——双向链表实现
思路:在不考虑使用双向链表的情况下,通过上面的例子最直接可以想到的便是暴力解法,即每滑动一次窗口时都遍历窗口内的值并得出其中最大的值加入到数组中,那么每次遍历窗口的时间复杂度为O(k),k为窗口的长度,那么长度为n的数组总共需要的时间复杂度为O((n+1-k)*k)。这样固然得出结果,但是否可以在将 “获取窗口内最大值” 的时间复杂度从 O(k)降低至O(1)?如果要降为O(1)的话,即只需进行一次操作即可获取窗口内的最大值,这里我们可以想到维护一个链表来,并且该链表内的大小顺序是从大(队首)到小..原创 2020-06-23 09:58:37 · 192 阅读 · 0 评论 -
LeetCode-560. 和为K的子数组——前缀和+哈希表
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。思路:前缀和通俗地来说就相当于数组的前 n 项和,题目中要求的是连续的子数组,并且还是连续和为k的。首先对于连续的子数组中的连续和,可以推出:su原创 2020-05-15 11:58:38 · 330 阅读 · 0 评论 -
LeetCode-887. 鸡蛋掉落 ——动态规划加二分查找
如果没有看懂题目意思的老哥,建议可以先看李永乐老师的视频:《复工复产找工作?先来看看这道面试题:双蛋问题》,下面我使用的思路方法也基本是按照该思路来的。思路:正如在例题解释中所说,要在最坏的情况下,那么什么是最坏情况下至少要扔几次呢?1)首先先考虑只有一个鸡蛋的情况下(假设有n层楼),那么你只能从第1层开始摔,要是你从中间开始摔并且摔坏了,那不好意思,你就只知道F层只有可能在中间层以下的位置...原创 2020-04-11 17:18:38 · 307 阅读 · 0 评论 -
LeetCode-1155. 掷骰子的N种方法 ——动态规划
这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, …, f。我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),模 10^9 + 7 后返回。示例 1:输入:d = 1, f = 6, target = 3输出:1示例 2:输入:d = 2, f ...原创 2020-04-03 11:26:53 · 451 阅读 · 0 评论 -
LeetCode-312. 戳气球—分治算法加动态规划
思路:在使用分治法时,我们应该考虑的核心问题是如何用子问题的解来表示原问题的解,也就是子问题该如何划分才能通过子问题来求解原问题。我们把描述子问题的解与原问题的解之间的关系的表达式称为状态转移方程。首先我们尝试每戳破一个气球,以该气球为边界将气球数组分为两部分,使用这两部分的解来求解原问题。我们设戳破区间 i 到 j 间的气球我们得到的最大金币数为coin。及coin = def( i ,...转载 2020-03-20 10:21:16 · 464 阅读 · 0 评论 -
LeetCode-322. 零钱兑换—dfs和动态规划两种方法解决
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1说明:你可以认为每...转载 2020-03-16 16:13:38 · 194 阅读 · 0 评论 -
LeetCode-494. 目标和 ——动态规划
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例 1:输入: nums: [1, 1, 1, 1, 1], S: 3输出: 5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1...转载 2020-03-15 17:37:13 · 191 阅读 · 0 评论 -
LeetCode-面试题57 - II. 和为s的连续正数序列——滑动窗口
滑动窗口的重要性质是:窗口的左边界和右边界永远只能向右移动,而不能向左移动。这是为了保证滑动窗口的时间复杂度是 O(n)O(n)。如果左右边界向左移动的话,这叫做“回溯”,算法的时间复杂度就可能不止 O(n)O(n)。在这道题中,我们关注的是滑动窗口中所有数的和。当滑动窗口的右边界向右移动时,也就是 j = j + 1 ,窗口中多了一个数字 j,窗口的和也就要加上 j。当滑动窗口的左边界向右...转载 2020-03-06 17:34:38 · 153 阅读 · 0 评论 -
LeetCode-207. 课程表 ——广度优先搜索(BFS)
思路参考LeetCodeclass Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { //precourse[i]表示第i个课程有多少个入度,即该课程有多少个先修课 int[] precourse = new int[numCourses]; ...原创 2020-02-27 10:46:57 · 179 阅读 · 0 评论 -
LeetCode-301. 删除无效的括号 ——广度优先搜索(BFS)
为何用BFS而不是DFS利用BFS理解起来要远远比DFS要简单的多,因为这道题说的是删除最少的括号!!,如果我们每次只删除一个括号,然后观察被删除一个括号后是否合法,如果已经合法了,我们就不用继续删除了啊。因此我们并不需要将遍历进行到底,而是层层深入,一旦达到需求,就不再深入了。如何进行BFS在进行BFS之前,要先判断 ’ ( '和 ’ ) '是否有需要删除的,然后在根据需要删除的 ’ (...原创 2020-02-25 16:59:45 · 307 阅读 · 1 评论 -
LeetCode-45. 跳跃游戏 II ——贪心算法
解题思路:从数组的第 0 个位置开始跳,跳的距离小于等于数组上对应的数。求出跳到最后个位置需要的最短步数。比如上图中的第 0 个位置是 2,那么可以跳 1 个距离,或者 2 个距离,我们选择跳 1 个距离,就跳到了第 1 个位置,也就是 3 上。然后我们可以跳 1,2,3 个距离,我们选择跳 3 个距离,就直接到最后了。所以总共需要 2 步。解法一 :顺藤摸瓜LeetCode 讨论里,大部...转载 2020-02-24 18:10:18 · 308 阅读 · 0 评论 -
LeetCode-52. N皇后 II——回溯
思路:1.)将第一个皇后放到第1行第一列,判断是否OK(当然放第一个时肯定是可以的)2.)再将第二个皇后放到第2行第一列,由于不能互相攻击(即不能在同一行同一列同一对角线上),那么就放在第二列、第三列、依次把所有列都放完,找到一个合适的3.)依次类推,直到第N个皇后也能放在一个不起冲突的位置,则找到了一个解4.)当得到一个解后,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一...原创 2020-02-22 13:07:13 · 190 阅读 · 0 评论 -
LeetCode-200. 岛屿数量——深度优先搜索(DFS)和广度优先搜索(BFS)
方法一:深度优先搜索遍历这个二维数组,如果某一结点包含"1",则将该结点作为根节点,上下左右地进行搜索查找符合要求的。如果找到下一个符合要求的结点,再次以该结点作为根节点进行搜索。深度优先搜索的核心就是:优先往纵向挖掘深入,而不是对一个结点的所有邻接结点进行访问,也是一种递归的过程class Solution { //上下左右 int[] xx = {-1,1,0,0};...原创 2020-02-21 11:09:02 · 333 阅读 · 0 评论 -
LeetCode-63. 不同路径 II——动态规划
此题也是要用动态规划,可以参照 LeetCode-62. 不同路径——动态规划入门但这里要注意,如果起点就有障碍物的话,那么根本到不了终点。同样的,如果只有一行或一列的话,但中间存在障碍物的话,那么也是到达终点的。也就是说,我们在设置第一行第一列中的dp值时不仅要判断当前位置是否有障碍物,同时也要判断前面的值是否存在障碍物,这里我们可以当判断出当前位置没障碍物直接将上一次的结果赋值到当前值中即...原创 2020-02-20 20:07:45 · 183 阅读 · 0 评论 -
LeetCode-62. 不同路径——动态规划入门
看到这题,很容易能想到用递归的思路,递归大概的思路如下假设有2×3的网格,那么从编号1出发,左子树表示从该点向下,右子树表示从该点先右,统计最后的根节点为6的个数即为路径的总和,其实这题跟LeetCode-64. 爬楼梯的思想差不多的.递归的代码如下public class Question_62 { public int uniquePaths(int m, in...原创 2020-02-20 17:40:40 · 137 阅读 · 0 评论 -
LeetCode-79. 单词搜索——回溯(DFS)
思路:该题这是一个使用回溯算法解决的问题,涉及的知识点有 DFS 和状态重置,从给定的word的首字母出发,并从上下左右进行判断是否有符合的,如果有,则以下一个符合的作为起点,重复上次的操作,这样正是DFS的核心思想,而如果该点的下一个没有符合要求的结果,那么就设置该点未访问,这也就是状态重置注意:在dfs的时候,如果已经找到一个正确的路径了,换句话说已经得到结果了,其实就没必要继续DFS了,...原创 2020-02-20 14:30:19 · 156 阅读 · 0 评论 -
LeetCode-70. 爬楼梯——动态规划
方法一:暴力法在暴力法中,我们将会把所有可能爬的阶数进行组合,也就是 1 和 2 。而在每一步中我们都会继续调用 climbStairsclimbStairs 这个函数模拟爬 11 阶和 22 阶的情形,并返回两个函数的返回值之和。climbStairs(i,n)=(i + 1, n) + climbStairs(i + 2, n)climbStairs(i,n)=(i+1,n)+clim...转载 2020-02-19 19:54:44 · 189 阅读 · 0 评论 -
LeetCode-64. 最小路径和——动态规划
看到这个题时,我立马觉得肯定要用dfs或者bfs来进行搜索(因为这个跟迷宫问题挺像的),遍历所有的路径,并将路径求和取最小值,于是我便用dfs进行遍历,虽然出得了结果,但要是数据过多的话会超时.public class Question_64 { //只能向下或者向右移动一步 static int[] xx={1,0}; static int[] yy={0,1}; ...原创 2020-02-19 16:20:17 · 227 阅读 · 0 评论 -
LeetCode-46.全排列 II——回溯法解决
思路:此题只是在原来的基础上加上可包含重复数字的条件,一样是通过回溯法来解决,只不过在添加时要判断新添加的是否有重复回溯的思路可以参考: LeetCode-46.全排列 Iclass Solution { public List<List<Integer>> permuteUnique(int[] nums) { Arrays.sort(num...原创 2020-02-19 13:58:21 · 194 阅读 · 0 评论 -
LeetCode-5.最长回文子串——动态规划解决
回文是一个正读和反读都相同的字符串,例如,“aba” 是回文,而“abc” 不是。使用动态规划解决的实现思路:一旦在一个回文串的两端,对称地加上相同的元素,那么新生成的字符串仍然是一个回文串public class Question_05 { public static String longestPalindrome(String s) { char[] ch =...原创 2020-02-19 13:18:05 · 265 阅读 · 0 评论 -
LeetCode-46.全排列——回溯法解决
回溯法是一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认 不是 一个解的话(或者至少不是 最后一个 解),回溯算法会通过在上一步进行一些变化抛弃该解,即 回溯 并且再次尝试。思路:这里假设数字的个数为n设置一个回溯函数,使用第一个整数的索引(first从0开始,且first<n)作为参数 backtrack(first)。如果当前该整数的索引first==n,...原创 2020-02-18 19:48:00 · 356 阅读 · 0 评论