再看几遍
liubeiandcaocao
这个作者很懒,什么都没留下…
展开
-
★背包问题 377,494,518,139,416,474,322
题意是给定一个数组,和给定一个目标值,数组里的元素可以重复使用,返回加和为目标值的所有组合的情况个数和组合39题不同的是,该问题虽然可以重复使用,即完全背包问题,但是组合后的元素之间的顺序也要考虑,即[1,1,2]和[1,2,1]是两种情况,而39题只考虑组合内的元素是否相同,没考虑顺序,属于完全背包问题。该题不属于完全背包问题,属于第三种情况class Solution: def...原创 2020-05-05 23:05:39 · 151 阅读 · 0 评论 -
岛屿4题集合 岛屿数量;岛屿最大面积;岛屿周长;岛屿填海求最大面积
DFS的好题岛屿数量和岛屿最大面积#1.200.岛屿数量和 2.695岛屿的最大面积 ☆☆☆class Solution: def maxAreaOfIsland(self, grid): row = len(grid) if row==0: return 0 col =len(grid[0]) res = 0 dp =[] count = 0 matri原创 2020-09-27 11:27:13 · 283 阅读 · 0 评论 -
215 数组中的第k个最大元素,重新学习记录快速选择
class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: def _partion(nums,left,right): rand_index = random.randint(left,right)#随机化切分元素 # randint 是包括左右区间的 nums[left],nums[rand_index] = num原创 2020-08-26 12:14:49 · 122 阅读 · 0 评论 -
记录记不住的知识点
记录字典的常用方法:import collectionsdic = collections.defaultdict(int)#初始化value为0的字典nums = [1,2,2,1,3,4]for num in nums: dic[num] +=1print(dic) #记录nums数组的每个数出现的次数:-> defaultdict(<class 'int'>, {1: 2, 2: 2, 3: 1, 4: 1})...原创 2020-08-25 21:05:59 · 104 阅读 · 0 评论 -
动态规划-最长公共子序列,最长公共子串
最长公共子序列,用动态规划的方法:返回子序列str1 = input().strip()str2 = input().strip()def LCS(str1,str2): #定义1个函数,就通过了 dp = [[0]*(len(str2)+1) for _ in range(len(str1)+1)] res = [] for i in range(1,len(str1)+1): for j in range(1,len(str2)+1):原创 2020-08-21 21:57:42 · 119 阅读 · 0 评论 -
牛客第2章习题
n = int(input())line =input().strip()nums = list(map(int,line.split())) #这就是这道题的知识点;python3中map后要list一下nums.sort()NN = sum(nums[::2])YY = sum(nums[1::2])print(abs(NN-YY))n , m= map(int,input().split())machines = []tasks = []for i in range(n):原创 2020-08-19 22:02:08 · 170 阅读 · 0 评论 -
leetcode(14)最长公共前缀-python
给定一组字符串,找出这些字符串的公共最长前缀。class Solution: def longestCommonPrefix(self, s: List[str]) -> str: if not s: return '' res = s[0] i=1 while i<len(s): while s[i].find(res) ...原创 2019-11-19 10:18:43 · 81 阅读 · 0 评论 -
动态规划系列1-字符串交错
对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成即字符串交错是指由A和B组成C,且C必须包含且仅包含A和B的所有字符,且对应的顺序不改变;...原创 2020-08-17 16:22:18 · 187 阅读 · 0 评论 -
二分法,2球之间的最大磁力;即最大最小值问题
求最小磁力的最大值能是多大class Solution: def maxDistance(self, position: List[int], m: int) -> int: position.sort()#需要先排序,才能求最大边界值 left = min((position[i+1] - position[i]) for i in range(len(position) - 1))#最小边界值 right = position[-1]-p原创 2020-08-16 18:35:52 · 196 阅读 · 0 评论 -
108将有序数组转为二叉搜索树(高度平衡搜索二叉树)
首先记起来二叉搜索树的概念,所有左右子树节点,左<中<右。同时要求满足高度差不超过1,则选择中点为根节点。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2020-03-03 10:22:06 · 140 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树;二叉树中任意节点的左右子树的深度相差不超过1,则是平衡二叉树回顾递归求深度的方案,是先求得左右子树的深度,然后进一步得到当前节点的深度,即先左右子树,再根节点;可以直接加入一个全局变量记录当前是否平衡,并额外引入一个逻辑来比较子树的深度;BFS迭代求深度的算法,是当前节点从上到下所在的层数,每个节点并不知道自己的深度(从下往上,从叶子节点到自身)class Solution: def isBalanced(self, root: TreeNo原创 2020-08-15 10:29:38 · 119 阅读 · 0 评论 -
leetcode(104)二叉树的最大深度 剑指 Offer 55 - I. 二叉树的深度 我可太喜欢BFS遍历的方法了,一定要掌握
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。两种方式:递归求解和非递归(迭代)求解方法一class Solution: def maxDepth(self,root): """ :type root: TreeNode :rtype: int ""...原创 2020-02-29 17:26:15 · 170 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点 用到了莫里斯遍历
方法1:二叉搜索树的性质,中序遍历左中右是升序的;使用中序遍历的变形,右中左,则第k个数就是第k大节点class Solution: def kthLargest(self, root: TreeNode, k: int) -> int: res = [] stack =[] while stack or root: while root: stack.append(root)原创 2020-08-14 13:28:21 · 173 阅读 · 0 评论 -
树的遍历总结 DFS+BFS+n叉树的遍历
关于树的遍历,前序,中序,后序,各有3种方法。递归;迭代;莫里斯这里进行总结:①递归总结:递归只需注意一点,函数调用是小括号不是中括号,preorder(root)√ preorder[root]×前序class Solution: def preorderTraversal(self,root): def preorder(node): return [node.val]+preorder(node.left)+preorder(node.right) if n原创 2020-08-13 15:56:49 · 311 阅读 · 0 评论 -
前序中序的莫里斯遍历
记一下这个题解前序中序的莫里斯遍历原创 2020-08-13 12:38:12 · 225 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I 剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - I. 在排序数组中查找数字 I给定排序好的上升数组,找出数组中目标值出现的次数;这种排序好的数组,找目标值在不在,出现的次数,就用二分法;示列:输入: nums = [5,7,7,8,8,10], target = 8输出: 2脑海里就推一遍[5,7,7,8,8,10], targrt=8class Solution: def search(self, nums: List[int], target: int) -> int: def原创 2020-08-09 13:21:33 · 129 阅读 · 0 评论 -
240.搜索二维矩阵Ⅱ 74. 搜索二维矩阵
搜索二维矩阵Ⅱ,整个矩阵从左到右,从上到下都是排好序的class Solution: def searchMatrix(self, matrix, target): if not matrix: return False height = len(matrix) width = len(matrix[0]) row = height-1 col = 0 #row and col确定左下角的点.原创 2020-05-28 22:40:15 · 138 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符 字典加k,v的学习
class Solution:#将计数字典改为[index,cnt]这样的kv组合字典;也就是说字典的val并不一定是一个值,可以是个列表;dict[key][index]即可 def firstUniqChar(self, s: str) -> str: d = {} #字符串是可以当做列表遍历的 for i, c in enumerate(s): if c in d: #在不在字典,是看这个值是不是keys,字典.原创 2020-08-04 22:57:58 · 131 阅读 · 0 评论 -
剑指 Offer 49. 丑数 小根堆的用法,类似BFS
题意,丑数定义为因子只有2,3,5;1也是丑数,给定n,返回第n个丑数用小根堆,从小到大的输出丑数class Solution: def nthUglyNumber(self, n: int) -> int:#方法一 小根堆,类似BFS的思路,添加一个,考虑当前元素 v = {1} q = [1] res = 0 for i in range(n): res = heapq.heappop(q)原创 2020-08-04 15:59:11 · 104 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串 滑动窗口思想的算法题
本题题意:给定一个字符串,找出其中最长的子字符串,且子字符串中不含重复字符;(子字符串要求连续,子序列不要求连续)滑动窗口,定义2个指针,维护窗口的起点和终点,根据当前窗口是否满足要求来进行不同的处理#滑动窗口思想;通常做法是①维护双指针代表窗口起点和终点,②然后根据当前窗口是否满足要求进行不同的处理class Solution: def lengthOfLongestSubstring(self, s: str) -> int: start = 0 #窗口的起点原创 2020-08-03 10:53:45 · 180 阅读 · 0 评论 -
剑指offer47礼物的最大价值
和剑指offer46一样,动态规划的题目,经典必看必学必会class Solution: def maxValue(self, grid: List[List[int]]) -> int: rows , cols = len(grid),len(grid[0]) for r in range(rows): for c in range(cols): premax=0#表示先前的最大值,初始化为0原创 2020-08-01 20:13:34 · 115 阅读 · 0 评论 -
剑指offer46 把数字翻译成字符串
动态规划的很经典的题目,原始方法和使用空间优化的方法,必看必学必会class Solution: def translateNum(self, num: int) -> int:#方法一 s = str(num)#整数转为字符串,才能用索引获取每个值 dp = [0]*len(s) #dp[i]表示以第i位字符为结尾的,翻译方法有多少种 dp[0]=1 for i in range(1,len(s)):原创 2020-08-01 19:47:19 · 113 阅读 · 0 评论 -
剑指offer42 连续子数组的最大和 经典动态规划题目
给定一个数组,求数组元素中的最大和,且要求元素是连续的;所以最大和要么是加上当前的元素,要么是从当前元素开始class Solution: def maxSubArray(self, nums: List[int]) -> int:] #动态规划的经典题目 res = float('-inf') #初始化最终结果为负无穷,因为数组可能全是负数 smax = 0 for i in nums: smax原创 2020-07-27 19:26:28 · 91 阅读 · 0 评论 -
数据流中的中位数;大根堆和小根堆的使用方法教学案例;剑指offer40 最小的k个数也是大根堆实现
最小堆最大堆,给定未排序的数组,找到中位数rom heapq import *class MedianFinder: def __init__(self): self.A = [] # 小顶堆,保存较大的一半 self.B = [] # 大顶堆,保存较小的一半 def addNum(self, num: int) -> None: if len(self.A) != len(self.B): heappush(原创 2020-05-30 20:15:30 · 138 阅读 · 0 评论 -
剑指offer40最小的k个数 使用快速选择来写,经典;用215题数组中的第k个最大元素的方法再写一遍快速选择
class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: if k==0: return [] def partition(s,e): if s>=e: #递归出口,此时不需要额外划分 return pivot = arr[s] #定义基线点原创 2020-07-26 16:50:54 · 127 阅读 · 0 评论 -
剑指offer38 字符串的排列 字典序的排列,贪心算法
class Solution: def permutation(self, s: str) -> List[str]: res = [] def getNext(s): for i in range(len(s)-1)[::-1]: #abdc 0123 012 if s[i] < s[i+1]:#从后往前找第一个小于其后一个字符的字符i,例如dc不满足 bd满足,i=b .原创 2020-07-23 23:22:09 · 128 阅读 · 0 评论 -
剑指offer36 二叉搜索树与双向链表的转换 递归的应用,主要是改中序遍历打印的内容,以及对链表的学习
这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。"""# Definition for a Node.class Node: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right"""clas原创 2020-07-22 22:19:49 · 81 阅读 · 0 评论 -
剑指offer34 二叉树中和为某一值的路径 递归+迭代
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:#方法一 .原创 2020-07-20 14:59:59 · 138 阅读 · 0 评论 -
剑指offer32-Ⅰ Ⅱ Ⅲ 关于打印二叉树的题,多看几遍其实很简单
BFS的好例子,使用双端队列的数据结构解决BFS# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneimport collectionsclass Solution: def levelOrder(self, root: Tr.原创 2020-07-17 11:29:13 · 103 阅读 · 0 评论 -
剑指offer 剪绳子
给定长度为n的绳子,剪成m段,具体m为多少就是算法要考虑的,反正m>1,即至少要剪成2段;使剪成的每一段的长度乘积最大思考:对于n<=3,至少要剪成2段,则长度必然缩小;即长度为2,1+1=2,11=1;长度为3,1+2=3,12=3;但对于长度4就不一定,1+3,2+2都行;使用字典,记忆化搜索class Solution(object): def cuttingRope(self,n): if n<=3: return n-1 memo = {} def c原创 2020-06-27 12:55:45 · 92 阅读 · 0 评论 -
二叉树中的最大路径和 递归的好例子
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。该题分为两部分,一是为每个node节点定义一个函数求贡献值,二是上一个节点的值为本身的值+左右两个节点的最大贡献值,递归回溯class Solution: def __init__(self): self.maxSum = float("-inf") def maxPathSum(self, root): def getmax(node):原创 2020-06-23 21:34:34 · 131 阅读 · 0 评论 -
剑指offer-数组中重复的数字
本题和287题类似,寻找重复的数字,但据博主观察,287题定义的范围是1~n,给定数组长度为n+1,即给定长度为4的数组,可取的值的范围为1,2,3,那么必然还有一个数,是重复的。该题,定义的范围是0~n-1,给定数组长度为n,即给定长度为4的数组,可取值的范围0,1,2,3,那么不一定存在重复的数字。就不能用287的方法,因为可取值0的存在。本题解法,利用范围0~n-1,即索引值,将对应的索引上放置对应的数字,如果不相等,就交换过来放置,如果相等,就放着。如果又找到一个,和要放置的索引上的值相等,那么原创 2020-06-17 11:31:25 · 93 阅读 · 0 评论 -
287. 寻找重复数 二分方法
给定一个 n + 1 个整数组成的数组 nums,其数字都在 1 到 n 之间(包括 1,n),可知至少存在一个重复的整数。题意:1~n个数本来该是n个数,组成n+1个数,则必然有重复数,找出重复数,而且题目假设只有一个重复数,所以剩下的数要填满1-n的数使用二分方法,统计<=mid的个数,如果左边不重复,则<=mid的数,应该为mid的值,如果大于mid的值,说明有左边有重复的数...原创 2020-04-12 22:03:45 · 232 阅读 · 0 评论 -
荷兰国旗问题,快速选择,partition,three way partition 快速选择的题,好题就多看几遍
1.荷兰国旗问题 【0,0,1,1,2,2,2】class Solution: def sortColors(self, nums: List[int]) -> None: ''' 荷兰三色旗问题解 ''' # 对于所有 idx < p0 : nums[idx < p0] = 0 # curr是当前考虑元素的下标 p0 = curr = 0 # 对于所有 idx &g原创 2020-06-15 23:05:29 · 177 阅读 · 0 评论