leetcode
数据结构
annaya
这个作者很懒,什么都没留下…
展开
-
53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和动态规划输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分解子问题当前数大于0,当前位置最大和 = 之前的和 + 当前位置,否则当前位置最大和 = 之前的和DP方程base case: 从1开始状态定义:nums[i]表示当前位置连续子串的最大和class Solution: def maxSubA原创 2020-06-25 23:14:31 · 96 阅读 · 0 评论 -
1143. 最长公共子序列
递归画出递归状态树就很了然了,注意base是-1表示为空。没啥毛病,但是超时了。。。class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: def helper(i, j): if i == -1 or j == -1: return 0 if text1[i] == text2[j]原创 2020-06-25 20:11:33 · 94 阅读 · 0 评论 -
347. 前 K 个高频元素 python
题目给定一个非空的整数数组,返回其中出现频率前 k 高的元素。输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]输入: nums = [1], k = 1输出: [1]排序解法:使用哈希表(python 中字典)来存储各个元素出现的次数,键(key)为对应元素,值(value)为对应元素出现个数。再对该哈希表(字典)按照值进行排序。class Solution: def topKFrequent(self, nums: List[int], k: i原创 2020-05-30 17:40:39 · 932 阅读 · 1 评论 -
面试题59 - I. 滑动窗口的最大值 python双端队列
暴力解遍历nums,遍历每个窗口中的值找出最大,但显然不是这题的意思class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: if k > len(nums) or k <= 0: return [] res = [] for i in range(len(nums)-k+1):原创 2020-05-30 13:14:42 · 266 阅读 · 1 评论 -
40 最小的k个数(python)
题目输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8 这8个数字,则最小的4个数字是1、2、3、4。方法一:(最简单的思路)整体排序后取前k个数class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: return sorted(arr)[:k]复杂度:O(nlogn)方法二:k轮冒泡排序class Solution: def g原创 2020-05-29 21:09:51 · 517 阅读 · 0 评论 -
55 &45 跳跃游戏
55. 跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。思路:贪心策略,实时维护最远可以到达的位置maxpos=(maxpos, i + num[i])。这个 i + num[i] 超级巧妙的哇!!!emm…也可能是我脑子不大够用QAQ对于当前遍历到的位置 ,如果它在 maxpos的范围内,就可以从起点通过若干次跳跃到达该位置,否则跳出class Solution: def canJump(sel原创 2020-06-22 00:13:10 · 124 阅读 · 0 评论 -
141. 环形链表
set有重复的都可考虑set dict.keyclass Solution: def hasCycle(self, head: ListNode) -> bool: s = set() while head: if head in s: return True s.add(head) head = head.next return Fals原创 2020-06-18 23:55:05 · 105 阅读 · 0 评论 -
21. 合并两个有序链表
递归class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1: return l2 if not l2: return l1 if l1.val <= l2.val: l1.next = self.mergeTwoLists(l1.next, l2) return l1原创 2020-06-18 23:50:52 · 95 阅读 · 0 评论 -
206. 反转链表
链表是经典的递归定义的数据结构,链表相关的题目常常考察递归递归子问题是什么:除去current node,翻转剩余链表,即除去1, reverseList(2->3->4->5),递归得到的解是 5->4->3->2base case是什么:当前节点为空,返回空,当前节点的next为空(只剩余一个节点),返回该节点处理当前层:翻转链表,即把1->2变为2->1,并释放当前层指向下一层的指针(注意:若不释放,2,3,4指向原本下一个3,4,5的原创 2020-06-18 22:09:33 · 90 阅读 · 0 评论 -
15. 三数之和
题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]暴力解三层for循环显然很扯。。时间复杂度很高,存在大量冗余。当一个数固定时,剩余两个数的和就固定了,若数组有序,则可根据三数的和决定原创 2020-06-15 22:09:23 · 138 阅读 · 0 评论 -
283. 移动零
class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ i = j = 0 for i in range(len(nums)): if nums[i] != 0: nu原创 2020-06-15 20:31:10 · 89 阅读 · 0 评论 -
11. 盛最多水的容器
暴力解:两层for循环,挨个寻找面积最大的。时间复杂度O(n^2)双指针两边移动可想到双指针面积受限于:1 左右的距离 2 最短边的高度所以如果左右两边靠近,只可能是原来min(左,右)的一边移动,因为此时的max(左,右)对面积没有起到作用,再求前后面积的最大值。相比暴力解,抛去了一些冗余。class Solution: def maxArea(self, height: List[int]) -> int: l, r = 0, len(height) -原创 2020-06-15 20:27:27 · 82 阅读 · 0 评论 -
200. 岛屿数量 python
题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3遍历–>两种思路: DFS 或者 BFSDFSclass Solution: def numIslands(self, gri原创 2020-06-09 23:55:02 · 888 阅读 · 0 评论 -
102. 二叉树的层序遍历 python
BFS模板:deque的结构来模拟队列队列里肯定有一个初始点每次从队列出队一个元素并处理对元素进行扩张(具体要看怎么扩张)满足条件的扩张的点进队列循环处理deque中的元素,直到为空注意:辨识某题是 BFS :是否可衍生出递归状态树,可用dfs,bfs从哪些点开始扩张class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: if not root:原创 2020-06-09 16:50:31 · 173 阅读 · 0 评论 -
104. 二叉树的最大深度
递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def maxDepth(self, root: TreeNode) -> int: if not root:原创 2020-06-03 15:47:59 · 100 阅读 · 0 评论 -
226. 翻转二叉树
递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not ro原创 2020-06-03 11:24:15 · 147 阅读 · 0 评论 -
101. 对称二叉树 python 迭代 递归
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3递归:首先以根节点以及其左右子树,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同,两个条件都要符合所以我们第一个传根节点的左子树和右原创 2020-06-03 10:56:26 · 217 阅读 · 0 评论 -
1. 两数之和 python 哈希表
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。nums = [2, 7, 11, 15], target = 9[0, 1]暴力时间复杂度O(n^2),可以把查询第二个值的时间复杂度从O(n)降为O(1)哈希表时间、空间复杂度O(n)class Solution: def twoSum(self, nums: List[int], ta原创 2020-06-01 11:18:39 · 484 阅读 · 0 评论 -
94. 二叉树的中序遍历 144. 二叉树的前序遍历
递归中序# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def inorderTraversal(self, root: TreeNode) -> List[int]:原创 2020-05-30 23:29:39 · 85 阅读 · 0 评论 -
242. 有效的字母异位词 python
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。输入: s = "anagram", t = "nagaram"输出: true输入: s = "rat", t = "car"输出: falsehash map dictcollections.defaultdict(int): 访问dict中不存在的key值不报错,默认值为0class Solution: def isAnagram(self, s: str, t: str) -> bo原创 2020-05-30 22:16:47 · 229 阅读 · 0 评论 -
214. 最短回文串(python) hard 暴力解 + O(n) KMP解法
题目给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。输入: "aacecaaa"输出: "aaacecaaa"输入: "abcd"输出: "dcbabcd"暴力解(思路很简单):— 字符串右边是齐全的,逐渐去掉末尾的元素,看这个字符串是否对称— 对称: 反转字符串并和原来比较,相等即对称。— 找到对称的部分,把前面去除的末尾元素反转后加到原字符串前巧妙class Solution: def shortestPal原创 2020-05-29 11:07:45 · 357 阅读 · 0 评论 -
665. 非递减数列(python)easy
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。输入: nums = [4,2,3]输出: true解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。输入: nums = [4,2,1]输出: false解释: 你不能在只改变一个元素的情况下将其变为非递减数列。思路:class Solution: def checkPossibility(self, nums: List[int]) -> bool:原创 2020-05-29 10:31:17 · 399 阅读 · 0 评论 -
299. 猜数字游戏(python)
你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。请注意秘密数字和朋友的猜测数都可能含有重复数字。输入: secret = "1807", guess = "7810"输原创 2020-05-23 11:34:02 · 370 阅读 · 0 评论 -
290. 单词规律
思路:pattern = "abba", str = "dog cat cat dog" a b b adog cat cat dog ^ i 第一次遇到 a, 加入到 HashMap HashMap = {a:dog} a b b adog cat cat dog ^ i 第一次遇到 b, 加入到 HashMap HashMap = {a: dog, b: cat} a b b adog cat cat dog原创 2020-05-23 10:17:18 · 193 阅读 · 0 评论 -
21. 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的输入:1->2->4, 1->3->4输出:1->1->2->3->4->4递归# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclas原创 2020-05-22 22:27:46 · 146 阅读 · 0 评论 -
24. 两两交换链表中的节点
题目给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。注意:你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。给定 1->2->3->4, 你应该返回 2->1->4->3.思路—需要创建dummy结点,返回dummy节点.next,否则head被交换或删除时需记录新head的位置才能返回—两两交换,python两指针可同时交换,不需要中间节点—循环条件:只要这一对节点存在class ListNode: def __.原创 2020-05-22 10:42:34 · 158 阅读 · 0 评论