
python
zingghalo
这个作者很懒,什么都没留下…
展开
-
NC403 编辑距离为一\NC196 编辑距离(一)、NC35 编辑距离(二)
NC403给定两个字符串 s 和 t ,如果两个字符串的编辑距离是1(仅用一次增删改), 则输出 true 否则输出 false。#看是否能依据删除(当有一个长)或者修改s[i](两个字符串一样长)来使s=tclass Solution: def editdistance(self , s: str, t: str) -> bool: if abs(len(s)-len(t))>1 or s==t: return False ..原创 2022-05-07 23:18:47 · 235 阅读 · 0 评论 -
NC220 重复的DNA序列、NC212 颜色分类、NC96 判断一个链表是否为回文结构、NC4 判断链表中是否有环、NC139 们的游戏(圆圈中最后剩下的数)
NC220题:找出所有在 DNA 序列中出现次数超过 1 次的连续子串,且子串长度等于10。注:返回的所有目标子串的顺序必须与原DNA序列的顺序一致用一个哈希表统计所有长度为10 的子串的出现次数,返回所有出现次数超过10的子串。class Solution: def repeatedDNA(self , DNA: str) -> List[str]: l,n,res = 10,len(DNA),[] dic = {} for...原创 2022-05-08 14:51:15 · 448 阅读 · 0 评论 -
42. 接雨水、NC168 盛水最多的容器
题:给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。42. 接雨水 - 力扣(LeetCode) (leetcode-cn.com)##法一动态规划用动态规划的方法提前得到每个位置两边的最大高度leftMax[i]和 rightMax[i]对于0≤i<n, 下标i处能接的雨水量=min(leftMax[i],rightMax[i])−height[i].class Solution: ...原创 2022-05-03 17:02:35 · 357 阅读 · 0 评论 -
NC145 01背包 问题、完全背包问题
1.题:有N件物品和一个最多能被重量为m 的背包。一个物品只有两个属性:重量和价值。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。0-1 背包问题无法使用贪心算法来求解,也就是说不能按照先添加性价比最高的物品来达到最优,这是因为这种方式可能造成背包空间的浪费,从而无法达到最优。#动态规划dp[i][j]表示前i件物品 体积不超过j 能达到的最大价值#根据第 i 件物品是否添加到背包中状态转移方程为:dp..原创 2022-05-01 22:06:11 · 360 阅读 · 0 评论 -
BM95 分糖果问题
题:1. 每个孩子不管得分多少,起码分到一个糖果。2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)1.递增序列每次比前次加一。2.递减序列的糖果数取决于递减序列长度与递增序列长度之间的大小关系class Solution: def candy(self , arr: List[int]) -> int: tmp,lej,lez,res=1,0,1,1 for i in range(1,len(arr)):原创 2022-04-28 17:46:53 · 524 阅读 · 0 评论 -
BM20 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。递归#分成两部分,大于和小于当前值的区间进行递归计算#每次记录后面元素小于当前元素的个数class Solution: def InversePairs(self , data: List[int]) -> int: def find(nums): if len(nums)<=0:retur...原创 2022-04-27 13:19:35 · 125 阅读 · 0 评论 -
BM79 打家劫舍(二)、BM65 最长公共子序列(二)、BM66 最长公共子串、BM68 矩阵的最小路径和、BM69 把数字翻译成字符串
1.BM79 打家劫舍(二)题:为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家,如果偷了第二家,那么就不能偷第一家和第三家。且第一个房间和最后一个房间视为相邻。计算在不被发现的前提下最多的偷窃金额。#对于一个人家,我们选择偷他或者不偷他,如果我们选择偷那么前一家必定不能偷;如果选择不偷他,那我们最多可以取得上一级的收益#移方程为dp[i] = max(dp[i - 1], nums[i - 1] + dp[i - 2])#既然是个环,那么第一家和最后一家不能同时偷。所原创 2022-04-20 21:22:59 · 391 阅读 · 0 评论 -
BM77 最长的括号子串、BM44 有效括号序列
括号需要一一匹配,而且先来的左括号,只能匹配后面的右括号,因此可以考虑使用栈的先进后出功能,使括号匹配。使用栈来记录左括号下标。遍历字符串,左括号入栈,每次遇到右括号则弹出左括号的下标。然后长度则更新为当前下标与栈顶下标的距离。遇到不符合的右括号,可能会使栈为空,因此需要使用start记录上一次结束的位置,这样下次用当前下标减去start即可获取长度#括号匹配都是用栈。class Solution: def longestValidParentheses(self , s原创 2022-04-20 17:51:39 · 321 阅读 · 0 评论 -
BM22 比较版本号、NC28 最小覆盖子串
题:牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等。现在给你2个版本号version1和version2,请你比较他们的大小。#利用两个指针表示字符串的下标,分别遍历两个字符串。#将点之间的部分转化为数字再比较#截取点之前的数字字符组成数字,即在遇到一个点之前,直接取数字,加在前面数字乘10的后面。class Solution: def compare(self , version1: str, version2: str) -> int:...原创 2022-04-19 18:02:23 · 321 阅读 · 0 评论 -
BM19 寻找峰值
二分查找的过程本质是对可行区间的压缩。只要满足二段性的问题都可以用二分查找解决。在这里二段性的体现是峰值的左边单调增,右边单调减。1.BM19寻找峰值题:给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。其中nums[i] != nums[i + 1]left和right不断逼近,往“峰”处压缩。nums[mid] < nums[mid + 1]说明在“上坡”,则可以使left = mid + 1(因为m...原创 2022-04-19 18:00:35 · 267 阅读 · 0 评论 -
BM55 没有重复项数字的全排列、BM57 岛屿数量、BM61 矩阵最长递增路径、NC345 城市群数量
1.给出一组数字,返回该组数字的所有排列法一 #递归class Solution: def permuteUnique(self , nums ): res = [] nums.sort() def backtrack(nums,temp): if not nums:#当到num中最后一个元素时,则证明此时已经找到一种排列了res.append(temp) return ...原创 2022-04-18 22:21:56 · 533 阅读 · 0 评论 -
动态规划:300. 最长递增子序列、DP7 连续子数组的最大乘积、DP13 [NOIP2002 普及组] 过河卒、DP23 不相邻取数、801. 使序列递增的最小交换次数
给你一个整数数组nums,找到其中最长严格递增子序列的长度。#状态转移方程 dp[i]=max(dp[j]+1,d[i]) j=1,...,i 且满足nums[i]>nums[j]class Solution: def lengthOfLIS(self, nums: List[int]) -> int: res=1 dp=[1 for i in range(len(nums))] for i in range(len(n...原创 2022-04-17 22:04:19 · 513 阅读 · 0 评论 -
JZ82 二叉树中和为某一值的路径(一)、JZ34 二叉树中和为某一值的路径(二)、BM37 二叉搜索树的最近公共祖先、BM38 在二叉树中找到两个节点的最近公共祖先、JZ36 二叉搜索树与双向链表
题: 判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。#直接递归class Solution: def hasPathSum(self , root: TreeNode, sum: int) -> bool: # write code here if not root:#root为空 return False sum-=root.val if not root.left and no原创 2022-04-27 13:17:31 · 1006 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n、JZ16 数值的整数次方
题:求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。class Solution: def __init__(self): self.res = 0 def sumNums(self, n: int) -> int: n>1 and self.sumNums(n-1)#n=1时就停止递归 self.res+=n re...原创 2022-05-03 17:40:12 · 249 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
题:一个机器人从坐标[0, 0]的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。问能够到达多少个格子?优化点:机器人可 仅通过向右和向下移动,访问所有可达解#法一 直接递归:遍历所有格子,递推计算出它们是否可达是否满足条件,然后用变量res记录可达的格子数量即可。class Solution: def sum(self,m): res=0 while m: ...原创 2022-04-12 12:14:40 · 97 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
递归+回溯+dfs首先,要在矩阵中找字符串中的第一个字符,找到后进入递归 对于已访问的、合适的位置,修改其值为空,访问完毕后要将值改回来,这是回溯的核心 已经等于字符串长度时,说明已经找到了一条路径,返回True 查找当前字符的周围字符,向下上右左4个方向#深度优先搜索(DFS)class Solution: def exist(self, board: List[List[str]], word: str) -> bool: def dfs(i,j, k) -原创 2022-04-06 17:24:31 · 244 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
#字符串分割,列表倒序。笔试用 面试不用class Solution: def reverseWords(self, s: str) -> str: return " ".join(s.split()[::-1])#双指针法 i为单词左边界 j为单词右边界去除首尾空格 倒序遍历 查找空格 需要考虑多个连续空格的情况class Solution: def reverseWords(self, s: str) -> str: .原创 2022-04-05 18:28:28 · 401 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字、剑指 Offer 57 - II. 和为s的连续正数序列
#注意是递增数列双指针法,i指向第一个元素,j指向最后一个元素。如果这两个元素的和等于target,则输出这两个元素如果比target大,让j往前移动一个如果比target小,让i往后移动一个class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: i,j=0,len(num...原创 2022-04-05 14:01:29 · 226 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面、JZ81 调整数组顺序使奇数位于偶数前面(二)
#双端队列:奇数插左边偶 数插右边class Solution: def exchange(self, nums: List[int]) -> List[int]: res=collections.deque() for i in nums: if i%2==0: res.append(i) else: res.appendleft(i) .原创 2022-04-05 11:47:16 · 156 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
这个题也太浪漫了! 双指针法:#两个链表长度分别为a、b, c为公共部分的长度, 当两个指针都走a+b-c时,就会相遇到公共点。 #不会陷入死循环,因为即使没有相同节点,当走到末尾都是 None也会跳出循环class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: curA,curB=headA,headB while cu..原创 2022-04-04 18:25:31 · 253 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
#顺序查找:先求长度,再循环到n-k (倒数第k个节点即为正数第n - k个节点)class Solution: def getKthFromEnd(self, head: ListNode, k: int) -> ListNode: i,node=0,head while node: i+=1 node=node.next node=head for i in range...原创 2022-04-03 14:13:33 · 411 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
题:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。#链表的处理思路:(小白要一步步思考才能写出来😢)特例 》初始化 》从何时开始或结束遍历 》 判断并做出某种修改 》 考虑往下循环遍历 》 最后返回什么class Solution: def deleteNode(self, head: ListNode, val: int) -> ListNode: if head.val==val:return head.nex原创 2022-04-02 18:15:10 · 246 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串、剑指 Offer 48. 最长不含重复字符的子字符串
#固定右边界 j ,同时定义从边界 j 往左侧距离最近的相同字符的索引为 i例如:“abcba”,索引从0开始。 j=2时最长字符串”abc",即res[2]=3。1、j=3时有b,而上一个b在res[j-1]=”abc"里,即j-i<res[j-i], 按j-i计算res[j],此时最长字符串为“cb”的 长度2。2、j = 4时有s[j]=a,上一个a在子字符串res[j-1]=“cb”之外,以a结尾的字符串自然在res[j-1]的基础上加上字符s[j]=a就构成了新的...原创 2022-04-02 14:46:18 · 237 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
class Solution: def translateNum(self, num: int) -> int: #使用余数来取当前数值 绝! res0,res1=1,1 y=num%10 num=num//10 while num!=0: x=num%10 #从右往左遍历也是一样的 if 10 <= 10 * x + y <= 25: ...原创 2022-04-01 22:47:55 · 62 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润、剑指 Offer 42. 连续子数组的最大和、剑指 Offer 47. 礼物的最大价值、BM81 买卖股票的最好时机(二)、BM82 买卖股票的最好时机(三)
题:把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润题:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。题:从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。计算最多能拿到多少价值的礼物?剑指 Offer 63. 股票的最大利润、剑指 Offer 42. 连续子数组的最大和、剑指 Offer 47. 礼物的最大价值原创 2022-03-28 18:09:49 · 121 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题、剑指 Offer 10- I. 斐波那契数列
#动态规划#DPclass Solution: def fib(self, n: int) -> int: res=[0,1]#初始状态 for i in range(2, n+1): res.append(res[i-1]+res[i-2])#转移方程:res[i]=res[i-1]+res[i-2] return res[n]% (10 ** 9 + 7)#最优化DP方法:class Solution.原创 2022-03-28 12:35:48 · 132 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
这叫对称二叉树:#一个递归 考虑从上至下递归,判断每对节点是否对称#比较完整的写出递归函数的顺序class Solution: def isSymmetric(self, root: TreeNode) -> bool: if not root: return True#特例 return self.recur(root.left,root.right) def recur(self, roota: TreeNo...原创 2022-03-27 19:08:33 · 321 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
#递归 每个子二叉树都要交换class Solution: def mirrorTree(self, root: TreeNode) -> TreeNode: if not root: return root.left,root.right=self.mirrorTree(root.right),self.mirrorTree(root.left)#递归 交换左右子节点 return root#遍历树的所有节点node ,并交换.原创 2022-03-27 18:09:02 · 53 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
题:输入两棵二叉树A和B,判断B是不是A的子结构#先序遍历树A中的每个节点An:isSubStructure #判断以An为根节点的A的子树 是否包含树B:subis :从A树当前节点与B树的每个节点做匹配,当B为空的时候说明匹配完成,当A、B当前节点的值不相等时匹配失败,否则继续匹配左右节点class Solution: def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool: ...原创 2022-03-27 16:17:30 · 526 阅读 · 0 评论 -
剑指 Offer 32 - I、剑指 Offer 32 - II、剑指 Offer 32 - III.从上到下打印二叉树 、 NC45 实现二叉树先序,中序和后序遍历
题:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印#广度优先搜索class Solution: def levelOrder(self, root: TreeNode) -> List[int]: if not root:return [] res,sub=[],collections.deque() sub.append(root) while sub: node=sub..原创 2022-03-26 18:36:18 · 650 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
题:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。#用哈希表储存次数,键 i 的键值为i出现的次数。两次遍历。 dict.get(key[, value]) :返回指定键的值,如果键不在字典中返回默认值 None 或者设置的value值。class Solution: def firstUniqChar(self, s: str) -> str: if not s: return ' ' dic={}原创 2022-03-25 22:45:13 · 58 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
题:给你一个可能存在重复元素值的数组numbers,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素.#旋转点x的值为最小值 #以数组中的最后一个元素numbers[j]作为基准:在x右侧的元素,值一定都小于等于numbers[j];而在最小值左侧的元素,值一定都大于等于numbers[j]。 class Solution: def minArray(self, numbers: List[int]) -> int: ...原创 2022-03-25 21:50:37 · 71 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
题:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。从二维数组的右上角开始查找。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。如果当前元素等于目标值,则返回true。class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: if not matrix:.原创 2022-03-25 17:44:59 · 59 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
题:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。排序数组中的搜索问题,首先想到二分法解决。#从左到右,第一个num[i]不等于i的元素。缺少iclass Solution: def missingNumber(self, nums: List[int]) -> int: i,j=0,len(nums)-1 while i<=j: m=(i+j)//2 ...原创 2022-03-24 23:10:38 · 59 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
题: 统计一个数字在排序数组中出现的次数。#机智版class Solution: def search(self, nums: List[int], target: int) -> int: if not nums: return 0 def right(ta): i, j = 0, len(nums)-1 while i <= j:#为了弹出边界点 #二分 [i,原创 2022-03-24 22:52:40 · 60 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
#我的方法 :记录数组的各个数字,当有重复数字时直接返回class Solution: def findRepeatNumber(self, nums: List[int]) -> int: dic =[] for num in nums: if num in dic: return num else: dic.append(num)原创 2022-03-24 21:46:08 · 66 阅读 · 0 评论 -
20 表示数值的字符串
题:实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。正则化用的非常666import re class Solution: def isNumeric(self, str): res = re.match('^\s*[+-]{0,1}((\d)+((\.)(\d)+){0,1}|((\.)(\d)+)|((\d)+(\.)))([eE][+-]{0,1}[\d]+){0,1}\s*$',str) if res: .原创 2022-03-23 23:29:28 · 70 阅读 · 0 评论 -
67 把字符串转换成整数(atoi)
题:实现把字符串转换成整数1.若干空格 2.(第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数3. 3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回03.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响3.3 整数超过 32 位有符号整数范围 [−2**31, 2**31− 1] ,需要截断这个整数,使其保持在这个...原创 2022-03-23 21:58:30 · 976 阅读 · 0 评论 -
75 字符流中第一个不重复的字符、BM52 数组中只出现一次的两个数字
题:实现一个函数用来找出字符流中第一个只出现一次的字符。如果当前字符流没有存在出现一次的字符,返回#字符。#利用字典这种数据结构,字符串为关键字,来统计每个关键字的对应次数。class Solution: # 返回对应char def __init__(self): self.str='' self.dic={} def FirstAppearingOnce(self): for i in self.str: ..原创 2022-03-23 18:03:45 · 790 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
#字符串切片拼接 class Solution: def reverseLeftWords(self, s: str, n: int) -> str: res=s[n:]+s[:n] return res#遍历用字符串拼接class Solution: def reverseLeftWords(self, s: str, n: int) -> str: res='' for i in rang...原创 2022-03-23 16:01:07 · 265 阅读 · 0 评论