- 博客(46)
- 收藏
- 关注
原创 189. 旋转数组
题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。说明:要求用空间复杂度为O(1)的原地算法我的想法,先延长数组,再切断……但提交以后突然发现,这也不是O(1)的 空间复杂度class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do...
2019-11-04 22:21:33 125
原创 172. 阶乘后的零
题目:给定一个整数 n,返回 n! 结果尾数中零的数量。题解:官方题解是不断除以5,知道n=0我的想法略有不同,但也差不多:class Solution: def trailingZeroes(self, n: int) -> int: x = 5 ans = 0 while n >= x: an...
2019-10-31 14:13:35 123
原创 171. Excel表列序号
题目:给定一个Excel表格中的列名称,返回其相应的列序号。一个不断加和乘的过程class Solution: def titleToNumber(self, s: str) -> int: if len(s) == 0: return 0 dic = {} for i in range(1, 27): ...
2019-10-31 13:56:17 143
原创 169. 求众数
题目:给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。我自己是用的字典,写这题是因为看到LeetCode的题解,觉得很巧妙:① 排序class Solution: def majorityElement(self, nums: List[int]) -> int: ...
2019-10-31 13:32:15 110
原创 166. 分数到小数
题目:给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fraction-to-recurring-decimal思路:其实这题不难,记得高中好像做过,就是要考虑的细节非常多:...
2019-10-31 13:10:35 200
原创 162. 寻找峰值
题目:峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。说明:你的解法应该是 O(logN) 时间复杂度的。思路:用二分即可#!/usr/bin/env python3...
2019-10-30 22:53:15 177
原创 155. 最小栈
题目:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。思路:本题的重点在于如何在常数时间检索到栈里的最小元素用另一个栈min_stack记录来记录截止当前的最小值,如果新加进来的元素小于等于min_sta...
2019-10-30 22:22:11 96
原创 152. 乘积最大子序列
题目:给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)思路:这题最开始想的是用动态规划来解,但由于正负数的情况不同,定义了positive和negative两个DP数组。非常非常简单粗暴的思路和各种判断:import sysclass Solution: def maxProduct(self, nums: List[int]) -&g...
2019-10-30 21:37:26 114
原创 151. 翻转字符串里的单词
题目:给定一个字符串,逐个翻转字符串中的每个单词。要求删除多余空格。class Solution: def reverseWords(self, s: str) -> str: if len(s) == 0: return "" ss = s.split(" ") res = "" for ...
2019-10-30 20:55:51 100
原创 148. 排序链表
题目:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。本题的重点在于,时间复杂度和空间复杂度的限制题解:链表的优势在于可以通过修改引用来更改节点顺序,无需开辟额外空间,而已循环交换。题解采用了归并排序的方法,通过不断二分排序再合并的方法,实现了O(nlogn)的时间复杂度和O(1)的空间复杂度下图来自LeetCode网站题解:链接:https://leetc...
2019-10-30 20:52:21 177
原创 146. LRU缓存机制
题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少...
2019-10-30 15:23:28 131
原创 141. 环形链表
题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。个人理解:不是很懂这道题,给了pos却没有用到…难道不是只需要判断一下pos是否-1吗,然而默认代码模板的输入却没有pos……代码:#!/usr/bin/env python3.6# _*_coding...
2019-10-29 22:30:03 103
原创 140. 单词拆分 II
题目:上一题139的加强版给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。我的实现方法是依旧是记忆化回溯,相比上一题加上了句子分割后的拼接。#!/usr/bin/env python3.6# _*_coding:utf-8 _*_# @Time : 2019/...
2019-10-29 22:14:21 113
原创 139. 单词拆分
题目:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。这题我一开始用暴力的回溯解法,因为忘记记录已搜索过的拆分点,导致在极端数据下会超时,时间复杂度会到O(n^n),如下:因此,改用题解中的第一种解法记忆化回溯,也就是用一个列表记录...
2019-10-29 21:08:55 124
原创 138. 复制带随机指针的链表
题目:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。思路:对于本题,主要是先拷贝一个不复制random的链表,同时用一个字典记录每一个节点的拷贝地址,然后再通过key-value设置拷贝链表的random指针。#!/usr/bin/env python3.6# _*_coding:utf-8 _*_# @Time ...
2019-10-27 22:51:35 98
原创 136. 只出现一次的数字
题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?本以为三分钟就能做完的题,但是要求不适用额外空间。这是我写的解法:#!/usr/bin/env python3.6# _*_coding:utf-8 _*_# @Time : 2019/10/26 17...
2019-10-26 17:35:52 258
原创 134. 加油站
题目:在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元...
2019-10-25 22:44:41 113
原创 131. 分割回文串
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。一开始的思路跟题解第二种方法很像:记录出每个区间是否回文+DFS但是在实现的时候有一个细节没想好: for i in range(n): for j in range(0, i+1): if i == j: p[j][i] = True continu...
2019-10-25 13:29:41 131
原创 125. 验证回文串
与普通的验证回文串不用的是,只验证字母和数字。class Solution: def isPalindrome(self, s: str) -> bool: i = 0 j = len(s) - 1 s = s.lower() while i < j: if s[i].isalnum() and s[j].isalnum(): if s[i] != s...
2019-08-23 15:53:10 112
原创 744. 寻找比目标字母大的最小字母
用二分法即可:from typing import Listclass Solution: def nextGreatestLetter(self, letters: List[str], target: str) -> str: if target < letters[0] or target >= letters[-1]: return letters[0]...
2019-08-23 15:49:55 149
原创 124. 二叉树中的最大路径和
乍一看这是一道困难题,但可能因为最近做的关于树的题目比较多,所以其实并没有真正意义上觉得特别困难,很多别的类型的中等题感觉比这还要难。题意:一棵非空二叉树,节点可正可负可为零,求最大路径和最开始的想法还是递归,其实也有一点动态规划的思想从根节点开始,依次计算子树包含子树根节点的最大路径和,保证了能够连成一条通路包含该子树根节点的最大路径和:左子树最大路径和(if>0)+根节点+右子...
2019-08-23 15:44:06 124
原创 118. 杨辉三角
给定n,输出n层杨辉三角class Solution: def __init__(self): self.ans = [] def generate(self, numRows: int) -> List[List[int]]: if numRows == 0: return self.ans self.ans.append([1]) if numRows == ...
2019-08-22 22:50:35 89
原创 116. 填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。初始情况所有next节点都为null,现在将每层的点加上next指针,如上图分析思路:因为给定的树为完美二叉树,所以如果一个点不是叶子节点,就必有左节点和右节点**结论1:**一个节点如果左节点不为空,则左节点的next必为右节点因为所有叶子节点都在同一层,因此如果父节点有next节点,且该节点必有next节点*...
2019-08-22 22:48:40 90
原创 108. 将有序数组转换为二叉搜索树
一个有序数组,转化为高度平衡的二叉搜索树每个节点的左右两个子树的高度差的绝对值不超过 1# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right...
2019-08-22 22:38:46 86
原创 105. 从前序与中序遍历序列构造二叉树
如题,根据前序与中序遍历序列构造二叉树整体思路:① 前序遍历的第一个元素,必然是二叉树的根节点② 在中序遍历中找到前序遍历第一个元素的位置③ 该位置左边的所有点都是二叉树的左子树元素,该位置右边的所有点都是二叉树的右子树元素思路一:递归+字典由整体思路可以构建子函数用于递归,不断求子树的左右子树,直到叶子节点。代码如下:# Definition for a binary tree ...
2019-08-22 22:35:44 138
原创 104. 二叉树的最大深度
如题,求二叉树的最大深度# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None class Solution: def ...
2019-08-22 21:28:04 98
原创 103. 二叉树的锯齿形层次遍历
本题跟102很像,就是将二叉树的偶数层逆序输出我是直接将上一题的结果的偶数层reverse一下# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.ri...
2019-08-22 21:25:52 104
原创 102. 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值,即逐层从左到右访问所有节点在子函数中传入层数,子树层数+1即可# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# se...
2019-08-19 21:01:19 75
原创 101. 对称二叉树
题目描述说,最好是能用递归或迭代做其实二叉树镜面对称,可以划分为其左子树与右子树对称而后,比较两棵树是否对称时,相当于比较:① A子树的左子树与B子树的右子树是否对称② A子树的右子树与B子树的左子树是否对称同时成立则说明两棵树对称分析到这里,解题就比较简单了# Definition for a binary tree node.# class TreeNode:# de...
2019-08-19 20:31:27 95
原创 575. 分糖果
这道题细想就会发现思路很简单小弟弟和小妹妹获得的糖果数是固定的:len(candies) // 2题意是想让小妹妹获得的种类数最多,那么只需要计算一下这堆糖果里有多少种糖果即可如果糖果种类数小于len(candies) // 2,则返回种类数,否则返回len(candies) // 2class Solution: def distributeCandies(self, candies:...
2019-08-19 17:16:23 87
原创 109. 有序链表转换二叉搜索树
这道题是将有序链表转化成高度平衡的二叉查找树。但由于我最开始在服务器那台机器上的网页编辑中写的,出现了一个比较玄学的错误,截图如下:就算在本地编译器中能跑通,在线上也显示这个错误┓( ´∀` )┏百度也没有什么效果于是晚上用自己的电脑,重新在本地编译器上手打了一遍再提交突然就好了emmm…Mark一下,可能是一些格式问题吧。# # Definition for singly-link...
2019-07-22 19:11:11 130
原创 986. 区间列表的交集
emmm 大概是少有的连第一次测试都没有bug,并且一次提交就通过的题目了就是代码写得比较幼稚,不够精简w(゚Д゚)wclass Solution: def intervalIntersection(self, A: List[List[int]], B: List[List[int]]) -> List[List[int]]: la = len(A) lb = len(B)...
2019-07-19 22:34:33 191
原创 871. 最低加油次数
我自己最初的想法是动态规划 f[i][j] 表示到第i个点时,加j次油最多能走多少英里f[i][j] = max(f[k][j-1] + k点的加油量 - k点到i点的油耗量)最后选择f[target点][i]>0中,最小的i值from typing import Listclass Solution: def minRefuelStops(self, target: int, s...
2019-07-17 12:50:23 499
原创 897. 递增顺序查找树
其实题目可以理解为:将给定的前序转化为中序,然后中序写成只有右节点的二叉树自己的解法就是很朴素的递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self...
2019-07-16 15:28:45 140
原创 400. 第N个数字
思路:一位数:9 * 1 * 1两位数:9 * 10 * 2三位数:9 * 100 * 3四位数:9 * 1000 * 4……直到n小于对应位数的数字总和为止然后把多出来是数字除以位数即可class Solution: def findNthDigit(self, n: int) -> int: l = 1 w = 1 num = 9 while n >...
2019-07-16 15:22:17 107
原创 974. 和可被 K 整除的子数组
题目如上首先的思路是遍历查找长度分别为1、2、……n的子序列,看看是否符合条件由于n的范围是3万,所以n^2级别的方法肯定会超时随后想到的是先把每个位置上的值先模上K,得到一个方便计算且加和后不会太大的数组接下来的思路是看题解得出来的:由于要求的结果是连续子序列的和,我们可以采用一个很常规的思路,就是新建一个数组s,s[i] = sum(A[0]…A[i]),即第i位表示前i个数字的...
2019-07-15 20:41:56 712
原创 628. 三个数的最大乘积
题目:给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。可以说是很傻很傻很傻了!!!这道题我做了一天!!!先是想用堆排序做!!!然后发现正负有很多种情况不知道怎么判断!!!越来越暴躁 越来越乱!!!其实最开始应该先列出各种情况,然后分析一下就会知道最大乘积的情况只有两种:min1min2max1, max1max2max3按照这个思路就很简单了╮(╯▽╰)╭f...
2019-04-10 18:12:50 119
原创 873. 最长的斐波那契子序列的长度
本题主要是求一串数组成的序列中,最长的斐波那契子序列的长度思路:个人理解,斐波那契数列的精髓在于你知道某两个数,就可以一直往前/往后推出整个数列的所有数,所以我们可以设任意两个数为该斐波那契子序列的最后两个数(作为一个状态),然后写出动态转移方程:ans[i][j] = ans[j][k] + 1(若ans[j][k] = 0,则改成+3)可能是我多年封印的动态规划突然开窍了…O(∩_∩)O...
2019-04-09 13:31:16 388
原创 203. 移除链表元素
随机pick的一道简单题移除链表中的特定元素我自己提交的代码:# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def removeElem...
2019-04-08 17:51:46 129
原创 890. 查找和替换模式
本题主要是解决在一串单词中,找出字母符合对应排列的单词的集合其实不是很难,但自己一开始自己想复杂了第一次提交的代码class Solution: def findAndReplacePattern(self, words: List[str], pattern: str) -> List[str]: if pattern == "": return words # 先求...
2019-04-08 16:08:42 810
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人