
leetcode
circle_yy
努力成为大神的小菜鸡
展开
-
从上到下打印二叉树系列(三道题)python+java
从上到下打印二叉树,可以看出是二叉树的广度优先搜索(bfs),bfs借助队列进行实现。java代码如下所示:class Solution { public int[] levelOrder(TreeNode root){ if(root == null) return new int[0]; Queue<TreeNode> queue = new LinkedList<TreeNode>(); ArrayList<.原创 2020-07-15 17:43:54 · 156 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组(java)
思想:本题目的难点在于减少重复计算,建立上三角和下三角,可以避免重复计算的问题,时间复杂度为O(n)。代码如下:class Solution { public int[] constructArr(int[] a) { if(a.length == 0) return new int[0]; int[] b = new int[a.length]; int tmp = 1; //分别计算上三角和下三角矩阵.原创 2020-07-13 21:47:01 · 174 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数(python+java)
思路:采用动态规求解,有以下理解:状态转移方程:把n个骰子分为第n个骰子和前n-1个骰子,求n个骰子的点数和S,等于第n个骰子的点数m+(S - m),s-m表示前n-1个骰子的点数和为s-m;因此求n个骰子的点数和的公式如下所示:n表示n个骰子,j表示n个骰子取得的点数和,i表示第n骰子的点数;初始化操作:一个骰子的时候点数为1到6,出现的和也为1到6;因此次数均为1;注意的点:n个骰子的和,其值最小为n, 最大为6*n+1,且是连续的,间隔为1;骰子的个数从1开始,因此dp[0].原创 2020-07-12 21:25:07 · 386 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
题目:理解:关键点:确认窗口的下标双端队列来简化每次查找窗口内最大值的时间复杂度(从O(k)变为O(1))实现窗口内O(1)的复杂度,通过建立一个单调递减的双端队列来实现在双端队列中,随着窗口的移动,队首元素出队来改变当前窗口内的最大值在双端队列中,随着窗口的移动,队尾元素出队来建立一个单调递减的队列代码:class Solution: def maxSlidingWindow(self, nums, k): queue = [] result = []原创 2020-07-12 17:35:54 · 167 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序(简单)
思路一:双指针法实现思想是利用双指针来定位每个单词;即两个指针初始化时都指向字符串的末尾,然后移动首指针来定位最后一个单词的开始位置(即定位到空格即可);之后利用首尾指针即可取出当前的单词;然后移动首指针跨过空格,找到下一个单词的末尾,之后移动尾指针,使其等于首指针,两个指针都定位到下一个单词的末尾,之后移动首指针,找到这个单词的开始,然后依据首尾指针获取单词即可。’代码如下:class Solution: def reverseWords(self, s): s .原创 2020-07-09 21:51:40 · 328 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字 python
明显数组有序,因此用二分查找,提高时间复杂度;判断当前数字是否等于下标,若等于,则继续代码如下:class Solution: def missingNumber(self, nums): low = 0 high = len(nums) - 1 n = len(nums) - 1 while low <= high: mid = (low + high) //2 if nums[mid] == mid: .原创 2020-07-09 20:18:18 · 233 阅读 · 0 评论 -
剑指offer 连续子数组的最大和
分析题意可以得出本题可以用动态规划求解,即求出数组中以每个元素结尾的最大和,然后最后去找最大的即可。注意:是否加上之前的结果,如果之前结果大于0,则可以加上,如果不大于0,则无需加上状态:以当前元素结尾的最大和,用dp[i]表示;状态转移方程:dp[i] = max(dp[i - 1], 0) + nums[i]代码如下:class Solution: def maxSubArray(self, nums): dp = [0] * len(nums) dp[0原创 2020-07-08 21:05:33 · 154 阅读 · 0 评论 -
leetcode 322 零钱兑换(动态规划,完全背包,打表法)
题目:我们利用 打表法来找出转移方程:方阵中每一个格子的值计算过程如下所示:行表示硬币的面值,列表示金额amnout的数量;我们对首先对每个格子的初始化值都为amnout + 1;每一行表示目前只能取到0到i个硬币,后面面值的硬币先不考虑;对于dp[i][j](即每个格的值所代表的含义:表示在凑出当前金额j所需要0到i个硬币的最小数量;很容易理解,我们的第一列值都应该为0;凑出金额...原创 2020-05-01 18:32:11 · 349 阅读 · 0 评论 -
leetcode 面试题56 - I. 数组中数字出现的次数(中等,位运算,python)
题目总结:首先考虑一个简单的问题:如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?两个相同的数异或结果是0,任何一个数和0异或结果是它本身。因此,对于这个问题,我们只需要多所有的数组进行异或,最后的结果就是那个出现了一次的数字。在这个问题基础上,我们来解决本题,本题中有两个数字出现了一次,因此,如果按照第一题的思路对所有的数字进行异或,则最后的结果是两个不同的数...原创 2020-04-28 22:00:19 · 226 阅读 · 0 评论 -
leetcode 面试题14- II. 剪绳子 II(动态规划,中等,python)
题目:题解:分析题意:n > 1,m > 1;经过简单分析可以得出,当绳子的长度n为2时,2可以剪成1和1的两段,所以最大乘积为1;n为3时,3可以剪成1和2的两段,所以最大乘积为2;因此,在进行动态规划过程中,当绳子的总长度大于3时候,遇到长度为2和3的绳子就不再进行剪断;(2>1,3>2),以得到最大的乘积;状态转移方程:dp[i]表示绳子长度为i时,所能...原创 2020-04-27 11:50:56 · 341 阅读 · 0 评论 -
leetcode 739. 每日温度(单调栈)(中等,python)
题目:题目理解:对于气温列表中的每个元素,寻找大于当前元素的一个元素,计算两个元素之间的下标差,作为新的列表中当前元素的值。解题思路:本题我们利用单调递减栈进行求解:遍历气温列表,如果当前元素小于栈内的元素,就进行入栈当前元素对应的下标;否则,计算栈顶元素和当前元素对应的下标之间的差,保存在新的列表中。代码如下:class Solution: def dailyTemper...原创 2020-04-14 14:13:02 · 252 阅读 · 0 评论 -
leetcode题解84.柱状图中最大的矩形(困难)单调栈思想
题目:找出最大的矩形面积,首先要有一个较好的遍历方法。本题找最大面积的遍历方法可以依据依据以下策略:找出以每个矩形为高的最大矩形面积。因此我们需要遍历每一个矩形高度,找出以当前矩形高度作为高的最大矩形面积。最后遍历所有的矩形高度,最大的面积即为所求。依据上述思路,为了找到以当前柱子高度作为矩形高度的最大面积,我们需要寻找矩形的左右更边界来确定矩形的宽度,因此我们可以作出以下分...原创 2020-04-13 22:59:14 · 185 阅读 · 0 评论 -
leetcode 三月每日一题 695. 岛屿的最大面积(深度优先搜索中等python)
题目:题目思想:本题是求所有水平和垂直方向相连接的数字1的数量,我们利用深度优先搜索进行求解;我们需要遍历每个格子来进行查找岛屿的最大面积;并且,每个格子可以向四个方向进行遍历;并且为了避免重复访问的情况,我们设置访问过格子的数值为2;同时因为要求所有相连接1的数量,所以我们每次进行递归深度返回的时候需要对访问过的格子数量进行+1;代码如下所示:class Solution: ...原创 2020-04-09 12:16:11 · 416 阅读 · 0 评论 -
leetcode 三月每日一题:820. 单词的压缩编码
题目:本题思想:在本题中,关键在于小的单词是否是大的单词的后缀子集,对不是后缀的单词长度加一(#号),然后对所有符合条件的单词进行求和;暴力法思路:枚举每个单词的所有后缀,然后看是否存在于原单词列表中,如果存在,在原单词列表中进行删除。解法一(暴力法):(参考官方题解)代码如下:class Solution: def minimumLengthEncoding(self,...原创 2020-04-08 22:48:44 · 228 阅读 · 0 评论 -
leetcode 三月每日一题 365.水壶问题(中等)
题目:思想:根据题意,每次可以进入如下的操作,分别是:装满任意一个水壶清空任意一个水壶从一个水壶向另外一个水壶倒水,直到装满或者倒空上述三种操作分别对两个水壶进行,则一共有六种操作,如下所示:装满水壶X装满水壶Y清空水壶X清空水壶Y把X的水倒入Y中,其中包含两种情况:(1). X的水倒入Y中还有剩余,(2). X的水倒入Y中没有剩余;把Y的水倒入X中,其中也包含两种...原创 2020-04-06 23:00:22 · 296 阅读 · 0 评论 -
leetcode 三月每日一题:409. 最长回文串(简单)
题目:思路:经过分析可以得到,在回文串中,如果是偶数长度的回文串,则每个字符出现的次数都是偶数,如果是奇数字符串,则除了中心字符出现次数是奇数,其他字符出现次数都是偶数。依据上述思路,有下述伪代码:1.首先利用字典计数每个字符出现的次数;2.然后遍历字典的value,如果是偶数次数,就算入回文串的长度temp,如果是奇数次数(odd),对temp 执行:temp+=(odd//2)*2...原创 2020-04-06 15:50:47 · 160 阅读 · 0 评论 -
leetcode三月每日一题(1160)拼写单词
题目:思路:原理:对于词汇表中的每个单词,只要单词中每个字符出现的次数只要小于等于字母表中每个字符出现的次数,那么单词就可以用字母表表示。因此,利用以下思路解决:建立两个字典进行存储,一个字典存储词汇表中的每个单词中每个字符出现的次数,一个字典存储字母表中每个字符出现的次数。代码如下:class Solution: def countCharacters(self, word...原创 2020-04-06 15:04:26 · 141 阅读 · 0 评论 -
leetcode 200.岛屿数量(中等,深度优先搜索+回溯)
岛屿数量:这一题与单词搜索一题思路相同;用深度优先搜索来解决本题;对于此类问题,需要两步,第一步需要需要遍历网格的每个位置,设置一个访问数组,防止元素被重复访问;第二步是对于每个访问到的位置,需要向四个方向进行寻找,因此向四个方向进行搜索;递归终止条件:如果访问到字符’0’,就行返回,(回溯)。代码如下:class Solution: def numIslands(se...原创 2020-03-27 19:30:36 · 261 阅读 · 0 评论 -
leetcode 32.最长有效括号(hard,动态规划)
本题用动态规划求解,通过积累计算过的有效括号的数量来找以当前字符结尾有效括号的数量。状态转移方程:动态规划是以时间换空间的做法,对于计算过的结果保存下来,不再计算;在本次中dp数组设置为以当前字符结尾的有效字符串的数量;这一题与最长递增子序列那一题dp数组表示的含义大致相同(异曲同工之妙);分析:如果当前字符s[i]为’(’,则很明显以该字符结尾的有效括号的数量为0;如果当前字符s...原创 2020-03-26 23:32:16 · 196 阅读 · 0 评论 -
leetcode 买卖股票的最佳时机(一,二简单,动态规划)
买卖股票的最佳时机(一):本题是获取最大利润;利用动态规划求解,自底向上,找出从以前到今天可以获取的最大利润;因此最后一天的就是最大利润;状态每天有三种选择,买入,卖出,什么也不做;每天的状态有两种,今天有股票,今天没有股票;因此状态是一个二维数组:第一维的状态表示第几天,第二维表示今天是否有股票状态转移方程:dp[i][0]dp[i][0]dp[i][0]=max(dp[i−1]...原创 2020-03-25 15:55:55 · 249 阅读 · 0 评论 -
leetcode 5.最长回文子串(中等,动态规划)
中心扩展法:以例子"bababb"来介绍;找到回文串的中心,有两种情况,第一种是bab这种情况,第二种是bb这种情况;因此找的bab这种情况的中心有n个(中心为a),bb这种情况的中心个数为n - 1(中心为b与b之间的间隙), 因此中心数目一共是2n - 1;代码逻辑:遍历每一个中心点,查找回文子串;对于两种中心点,依次以中心点开始向两边扩展,判断中心点周围的值是否相等,如果相等,...原创 2020-03-24 14:38:38 · 157 阅读 · 0 评论 -
堆排序及代码实现
堆排序堆的先验知识:堆的实现通常是通过构造二叉堆实现。当不加限定时,堆通常指的就是二叉堆。二叉堆一般分为两种:最大堆和最小堆。最大堆: 最大堆中的最大元素在根结点(堆顶);堆中每个父节点的元素值都大于等于其子结点;最小堆: 最小堆中的最小元素出现在根结点(堆顶);堆中每个父节点的元素值都小于等于其子结点。二叉堆是一种完全二叉树,对于完全二叉树来说,只有树????的最后一层的节点不是满的,其他...原创 2020-03-22 21:57:57 · 553 阅读 · 0 评论 -
leetcode 面试题59 - II. 队列的最大值 (python)
题解:知识点:双端队列:在队列的两端都可以入队/出队的一种数据结构。在python中封装的包(deque):添加元素 deque支持从任意一端添加元素。extend() 一次性从右端添加多个元素append() 从右端添加一个元素extendleft() 从左端添加多个元素,注意是逆序输入appendleft() 从左端添加一个元素获取元素pop() ...原创 2020-03-16 23:23:48 · 230 阅读 · 0 评论 -
leetcode 面试题 01.06. 字符串压缩(python)(简单)
题目:题解:设置一个额外的字符串变量temp1,来存储压缩后的字符串;设置一个来存储压缩后的字符串变量temp1,一个计算当前字母出现次数的变量count(初始值为0);对于原始的字符串S,如果S[i] == S[i-count](即当前字符和需要计数的字符相等),因此count加1;如果不等,则在temp1中加入前一个需要计数的字符出现的次数,并且加上当前字符,count置1;最后...原创 2020-03-16 14:43:26 · 397 阅读 · 0 评论 -
leetcode 58. 最后一个单词的长度 (python)
题解:本题用逆向遍历进行求解:看到本题想到两种情况;最后一个是单词最后一个是空格对于第一种情况,直接计算最后一个单词长度,然后返回即可;但是这种情况也分为两种小情况,最后一个单词前面还有单词,因此判断最后一个单词是否结束的条件是当前指针指向的元素是空格;最后一个单词前面没有单词,因此结束条件是当前指针指向的位置为-1;对于第二种情况,需要先滤除空格,然后进行计算;但是...原创 2020-03-14 22:41:34 · 361 阅读 · 0 评论 -
leetcode 面试题57 - II. 和为s的连续正数序列(python)
题解:此题可以用滑动窗口算法求解:滑动窗口算法首先设置两个指针,分别是left和right,left指针和rifght指针用来限制滑动窗口的范围(即排列的范围);在滑动窗口中,right指针和left指针都是向右边移动;在滑动窗口中可以找到所有的排列。本题是求连续的正整数序列,因此可以想到排列中的数字是1到target - 1范围;又由于对于目标target来说,组合它的序列不可能是...原创 2020-03-14 14:54:04 · 191 阅读 · 0 评论 -
leetcode 543. 二叉树的直径(python)
题解:本题用深度优先搜索我们通过画图来找寻本题的思路;容易分析得,本题需要两个dfs,一个是遍历左结点的子树,一个遍历右结点的子树;如图所示,首先遍历左边的结点一直到根;def dfs(node): if not node: return 0 dfs(node.left)此时需要进行回溯,回溯到结点2;但是路径长度需要+1;因此代码更改如下所示:def dfs(nod...原创 2020-03-10 17:38:01 · 281 阅读 · 0 评论 -
leetcode 322.零钱兑换 (python)
题解:本题一开始我用的深度优先搜索,但是超时间了,后来就用了动态规划;本题采用的是自底向上的动态规划;问题分解:参考自leetcode的官方题解:个人理解:对于当前的金额i,如果分解到上一步,需要遍历每一个硬币,来找上一步(即i-coins)的最小值;以总金额为2,coins=[1,2]为例;F(2) = min(F(2-1),F(2-2)) + 1 = 1代码如下,两层循环实...原创 2020-03-08 23:03:05 · 963 阅读 · 0 评论 -
leetcode 994. 腐烂的橘子(python)(广度优先搜索)
题解:经过分析,本题需要向四个方向进行遍历,对于新鲜????的感染是一层一层的,因此因此我们用广度优搜索进行求解,广度优先搜索需要借助队列来进行实现;基本思想如下:找出矩阵中所有腐烂????的坐标,然后进入主队列中;感染新鲜????的时间(即遍历的层数初始化为0);设置一个访问数组,防止矩阵中的元素被重复访问;对主队列的元素依次进行出队,对于每个元素,横纵坐标其一进行加一,判断当前????是否是新鲜????,如...原创 2020-03-04 17:33:39 · 418 阅读 · 1 评论 -
leetcode 面试题 10.01. 合并排序的数组(python)
方法一:把B的内容直接复制到A的剩余空间中,然后再对A应用快速排序。时间复杂度:O(m+n)log(m+n)代码如下:class Solution: def merge(self, A, m, B, n): A[m:] = B A.sort() return A方法二:双指针利用两个指针分别指向两个数组A和B,从头开始比较两个数组的元素大小,小的...原创 2020-03-04 10:49:42 · 305 阅读 · 0 评论 -
leetcode 206. 反转链表(python)
题解:本题有两种实现方法,分别是迭代法和递归法;我们需要实现的效果:1–>2–>3–>4–>5–>NoneNone–>1–>2–>3–>4–>5方法一:迭代法:利用双指针进行实现两个指针分别是pre, curr;再加一个临时变量temp;pre初始化为None;curr初始化为head;然后令temp=curr.n...原创 2020-03-03 10:58:25 · 228 阅读 · 0 评论 -
leetcode 225. 用队列实现栈(python)
题解:对于队列,是先进先出;对于栈,是先进后出,两者在元素出去的位置地方正好相反,因此我们需要用队列实现后进元素先出去的效果;乍一想,我们需要实现队列内元素的反转操作,但是此题的解题思想并没有完全实现反转,只是把队列的最后一个元素,移动到队头即可;这样就可以实现和栈相同的效果(后进先出);即我们需要实现队头元素为栈底元素。方法一:我们首选利用双队列来进行实现:基本思想如下:在队...原创 2020-03-02 19:56:57 · 392 阅读 · 0 评论 -
leetcode 面试题14- I. 剪绳子(python)
题解:对于本题,裁剪一段绳子,可以用递归方法进行求解,但是在用递归的时候会产生一系列的重复解,例如计算f(6),可以分为f(2), f(4);计算法f(8),可以分为f(4), f(4);就产生了重复计算f(4); 递归是自顶向下;我们在本题中可以利用自底向上的计算(动态规划),减少重复计算,同时可以利用贪心算法快速计算。方法一:动态规划从题意n > 1, m > 1;因此n...原创 2020-03-01 14:56:04 · 337 阅读 · 0 评论 -
leetcode 79. 单词搜索 (python)
题解:本题是一个遍历搜索问题,我们可以用回溯算法进行求解。在本题中,我们需要对二维网格的每个单元格进行遍历来查找和word的匹配;因此我们首先建立一个二层的循环来遍历每一个单元格;代码如下:class Solution: def exist(self, board, word): #设置数组中的元素只能被使用一次 used = [[Fals...原创 2020-02-27 21:32:02 · 625 阅读 · 0 评论 -
leetcode 51. N皇后(python)
题解:对于本题,我们首先创建一个棋盘,利用数组实现: def solveNQueens(self, n): grid = [['.'] * n for i in range(n)]#创建棋盘 queen = set()#存储皇后的位置索引 output = []#存储最后的结果 self.queenDFS(grid, 0, n,quee...原创 2020-02-27 16:02:02 · 345 阅读 · 1 评论 -
leetcode 面试题10- I. 斐波那契数列 (python)
题解:本题想起的有递归法和迭代法(动态规划法)递归法:在递归的过程中会产生大量的重复计算,因此,在数据量较大的时候,不是最优的解法。class Solution: def fib(self, n): def dfs(n): if n == 0: return 0 if n == 1: return 1 ...原创 2020-02-26 19:45:18 · 188 阅读 · 0 评论 -
leetcode (剑指offer)面试题28. 对称的二叉树(python)
题解:两种方法进行求解,一种是递归法(DFS),一种是迭代法(BFS)递归法:递归法的思想在于一个结点的左右子树是对应的,因此设置两条路径访问,来看左右子树是否对应相等。class Solution: def isSymmetric(self, root): if not root: return True def d...原创 2020-02-25 22:36:09 · 163 阅读 · 0 评论 -
leetcode 面试题27. 二叉树的镜像(python)
题目:题解:递归:利用深度优先搜索,深度优先搜索包括二叉树的先序,中序,后序遍历;在本题中我们利用二叉树的先序遍历来进行求解,在输出当前结点的值之后,交换此结点的左右结点,然后再进行遍历。代码如下:class Solution: def mirrorTree(self, root): def dfs(root): if root is not Non...原创 2020-02-24 15:36:34 · 237 阅读 · 0 评论 -
leetcode 39.组数总和 (python)回溯法
题目:题解:从题目可以看出是找所有组合的问题,因此就想起用递归,回溯的方法来求解。我们首先对数组进行排序,这样方便查找。代码思路:进行回溯的过程中,我们通过更新target来寻找合适的组合。即我们每次选取一个元素,就从target中减去这个元素,然后利用减去后的差来更新target。在进行回溯的过程中,我们需要确定回溯的数组范围,因此我们引入索引index,因为可以重复选择,所以i...原创 2020-02-22 20:39:29 · 403 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(python)
这一题看了labuladong的题解:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/对于本题的思路如下:分别找出左边界点和右边界点。查找左...原创 2020-02-20 22:18:43 · 416 阅读 · 0 评论