算法与数据结构
力扣,剑指offer 笔记
程序媛的攻城之路
这个作者很懒,什么都没留下…
展开
-
力扣279 完全平方数
参考:https://leetcode-cn.com/problems/perfect-squares/solution/dong-tai-gui-hua-bfs-zhu-xing-jie-shi-python3-by-2/完全平方数动态规划DP:class Solution: def numSquares(self, n: int) -> int: dp = [i for i in range(n+1)] for i in range(1,n+1):原创 2020-08-31 17:59:04 · 227 阅读 · 0 评论 -
力扣最长公共子序列
参考1参考2最长公共子序列class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: n1 = len(text1) n2= len(text2) dp = [[0]*(n2+1) for _ in range(n1+1)] for i in range(1,n1+1): for j in ran.原创 2020-08-26 11:22:50 · 282 阅读 · 0 评论 -
力扣136. 只出现一次的数字
使用位运算。对于这道题,可使用异或运算 \oplus⊕。异或运算有以下三个性质。class Solution: def singleNumber(self, nums: List[int]) -> int: return reduce(lambda x,y:x^y,nums)使用哈希表存储class Solution: def singleNumber(self, nums: List[int]) -> int: dic_ = dict.原创 2020-08-24 20:01:17 · 143 阅读 · 0 评论 -
计算器 python 栈
class Solution: def calculate(self, s: str) -> int: s = s.replace(' ', '') s = list(s) stack = [] i = 0 while i < len(s): temp = s[i] if temp in '+-*/': i += 1 .原创 2020-08-23 22:38:59 · 181 阅读 · 0 评论 -
力扣215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。暴力解法class Solution: def findKthLargest(self, nums, k): nums = sorted(nums,reverse=True) return nums[k-1]class Solution: def findKthLargest(self, nums: List[int], k: i原创 2020-08-22 22:28:56 · 100 阅读 · 0 评论 -
排序复习python
1.冒泡排序法(Bubble Sort)基本思想:将待排序的元素看做是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。python实现:def bubble(array): lens = len(array)原创 2020-08-03 23:00:58 · 230 阅读 · 1 评论 -
【牛客网】正则表达式python
题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配题解链接:https://www.nowcoder.com/questionTerminal/45327ae22b7b413ea21df13ee7d6429c?answerType=1&f=discuss原创 2020-08-02 21:54:23 · 148 阅读 · 0 评论 -
按之字形顺序打印二叉树python
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。# -*- coding:utf-8 -*-import copyclass Solution: def FirstNotRepeatingChar(self, s): # write code here if len(s) == 0: return -1 times =原创 2020-08-02 11:05:58 · 143 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)注意读题目,是只出现一次的字符# -*- coding:utf-8 -*-import copyclass Solution: def FirstNotRepeatingChar(self, s): # write code here if len(s) == 0:原创 2020-08-02 10:40:24 · 66 阅读 · 0 评论 -
数组中的逆序对python
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007其实这道题的意思就是寻找数组中的数比之前的数小的次数采用归并排序参考补充:图解归并排序:分而治之1.分2.治# -*- coding:utf-8 -*-import syssys.setrecursionlimit(2000)class Solution: def In原创 2020-08-01 21:55:53 · 469 阅读 · 0 评论 -
两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)利用双指针的方法,由于两个链表的长度可能是不一样的,所以在遇到这种情况,需要对其进行处理。将两个链表进行连接,即第一轮遍历时,将两个链表的末尾节点分别指向另一个链表的头节点,那么在第二轮遍历的时候,有交点即返回思路见# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):#原创 2020-08-01 16:55:13 · 88 阅读 · 0 评论 -
数字在排序数组中出现的次数python
题目描述统计一个数字在排序数组中出现的次数。暴力求解# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): # write code here count = 0 for i in data: if i == k: count += 1 return count二分法# -*- co原创 2020-07-31 17:18:43 · 255 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分治法简介:求一个规模为n的问题,先求左边规模大约为n/2的问题,再求右边规模大约为n/2的问题,然后合并左边,右边的解,从而求得最终解。具体可参考归并排序。步骤:求 pro(left, rigth) -> int先求pro(left, (left+right)/2) -> lval再求pro((left+right)/2 + 1, right) ->原创 2020-07-31 16:36:52 · 100 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树二叉查找树、平衡二叉树AVL,红黑树二叉查找树:特点:左孩子的值小于父节点,右孩子的值大于父节点。我们可以通过二分查找的思想快速找到某个节点。n个节点的复杂度为O(logn)但是在极端情况下这种情况随满足二叉查找树的要求,但是这也已经进化为一个链表,查找节点复杂度为O(n)平衡二叉树是为了解决二叉查找树退化成链表而诞生的方案平衡二叉树判断条件:满足所有二叉查找树的条原创 2020-07-31 15:11:47 · 102 阅读 · 0 评论 -
数组中只出现一次的数字python
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write code here result = list() for i in array: if i not原创 2020-07-31 10:05:27 · 127 阅读 · 0 评论 -
和为s的连续整数序列python
使用滑动窗口什么是滑动窗口?顾名思义,首先是一个窗口,既然是一个窗口,就需要用窗口的左边界i和右边界j来唯一表示一个窗口,其次,滑动代表,窗口始终从左往右移动,这也表明左边界i和右边界j始终会往后移动,而不会往左移动。这里我用左闭右开区间来表示一个窗口。比如滑动窗口的操作扩大窗口,j += 1缩小窗口,i += 1算法步骤:初始化,i=1,j=2, 表示初始窗口如果窗口中值的和小于目标值sum, 表示需要扩大窗口,j += 1否则,如果窗口值和大于目标值sum,表示需要缩小窗口,i +原创 2020-07-30 16:52:19 · 201 阅读 · 0 评论 -
和为s的两个数字python
思路:因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:1.初始化:指针i指向数组首, 指针j指向数组尾部2. 如果arr[i] + arr[j] == sum , 说明是可能解3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以j += 14. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以i += 1# -*- coding:utf-8 -*-class Solution: def FindNumbers.原创 2020-07-30 15:31:25 · 185 阅读 · 0 评论 -
扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现原创 2020-07-30 14:50:52 · 93 阅读 · 0 评论 -
孩子们的游戏python
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得原创 2020-07-30 11:17:48 · 309 阅读 · 0 评论 -
不用加减乘除做加法
public class Solution { public int Add(int num1,int num2) { int result = 0; int carry = 0; do{ result = num1 ^ num2; carry = (num1 & num2)<<1; num1 = result; num2 = c...原创 2020-07-29 18:03:14 · 96 阅读 · 0 评论 -
把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0class Solution: def StrToInt(self, s): # write code here if not s: return 0 l = {'1':1,'2':2,'3':原创 2020-07-29 11:17:20 · 110 阅读 · 0 评论 -
构建乘积数组python
思路一:两重循环,在遍历数组A的时候,A[i]赋值为1,计算B[i]。时间复杂度为O(N2)# -*- coding:utf-8 -*-class Solution: def multiply(self, A): # write code here result = [] for i in range(len(A)): temp = 1 for j in range(len(A)): .原创 2020-07-28 18:02:38 · 220 阅读 · 0 评论 -
表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。偷工减料法# -*- coding:utf-8 -*-class Solution: # s字符串 def isNumeric(self, s): # write code here try:原创 2020-07-27 22:03:17 · 77 阅读 · 0 评论 -
字符流中第一个不重复的字符串
借助字典存储出现次数思想# -*- coding:utf-8 -*-class Solution: # 返回对应char def __init__(self): self.str_ = dict() self.result = [] def FirstAppearingOnce(self): # write code here for i in self.result: if self.st.原创 2020-07-27 21:17:09 · 75 阅读 · 0 评论 -
链表中换的入口节点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。双向指针# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def EntryNodeOfLoop(self, pHead): # write code here原创 2020-07-27 20:51:53 · 82 阅读 · 0 评论 -
删除链表中的重复节点python
# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def deleteDuplication(self, pHead): # write code here cur = pHead result= ListNode(0) .原创 2020-07-27 11:17:54 · 119 阅读 · 0 评论 -
二叉树的下一个节点
一、暴力解法,思路比较好理顺# -*- coding:utf-8 -*-# class TreeLinkNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None# self.next = Noneclass Solution: def __init__(self): self.result =.原创 2020-07-26 15:06:45 · 57 阅读 · 0 评论 -
对称二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def isSymmetrical(self, pRo原创 2020-07-25 15:10:18 · 76 阅读 · 0 评论 -
将二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。运用层次遍历方法# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # 返回二维列表[[1,2],[4,5]] def Print(self,原创 2020-07-24 21:21:46 · 53 阅读 · 0 评论 -
序列化反序列化二叉树python
利用先序遍历进行序列化与反序列化需要注意的是空节点标记#很关键,因为反序列化需要靠#进行分割,判断# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: ss = [] def Serialize(self, root.原创 2020-07-24 14:17:53 · 101 阅读 · 0 评论 -
二叉树的第K个节点 python
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。中序优先遍历# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # 返回对应节点原创 2020-07-24 10:20:12 · 163 阅读 · 0 评论 -
滑动窗口最大值 deque
暴力解法class Solution: def maxInWindows(self, num, size): # write code here lens = len(num) result = [] if size == 0: return [] for i in range(lens-size+1): content = num[i:i+size] .原创 2020-07-23 11:06:50 · 143 阅读 · 0 评论 -
数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。代码:class Solution: def __init__(self): self.list_ = [] def Insert(self, num): # write co原创 2020-07-22 21:10:47 · 74 阅读 · 0 评论 -
矩阵中的路径python
思路:和机器人的运动范围类似运用回溯法和DFS方法进行遍历比较遍历整个矩阵,找到和字符串匹配的第一个字符然后遍历该字符的上下左右字符,如有匹配,就把该匹配字符作为节点,继续匹配其上下左右字符,如不匹配,则退回到上个字符,继续匹配为了防止重复,需要一个矩阵来存储走过的字符位置注意: 本题给定的是一个字符串,在对字符串(一维)进行索引遍历的时候,应i,j表示矩阵索引,则字符串索引应该为 i * cols + j代码:# -*- coding:utf-8 -*-class Sol.原创 2020-07-22 15:04:48 · 451 阅读 · 0 评论 -
机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?对于行列左边的数位计算:sum(map(int, str(i) + str(j)))运用回溯法# -*- coding:utf-8 -*-class Solut原创 2020-07-21 21:32:56 · 98 阅读 · 0 评论 -
剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。参考链接:https://www.jianshu.com/p/65b39734430c思路:这种题型一般用动态规划或者贪心算法进行解决动态规划动态规划:需要考虑两个条件:1、该问题是否可以分解成多个小问题进原创 2020-07-21 16:24:03 · 92 阅读 · 0 评论 -
剑指offer---从尾到头打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。#!/usr/bin/env python# _*_ coding:utf-8 _*_class ListNode: def __init__(self, x): self.val = x self.next = None# #方法一简单列表保存输出# class Solution:...原创 2020-02-10 13:11:26 · 81 阅读 · 0 评论 -
力扣之链表12—复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:val:一个表示 Node.val 的整数。random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 nu...原创 2020-01-13 16:48:01 · 97 阅读 · 0 评论 -
力扣之链表11—扁平化多级双向链表
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。输入:1—2---3—4---5—6–NULL|7—8---9—10–NULL|11–12–NULL输出:1-2-3-7-8-11-12-...原创 2020-01-11 22:03:02 · 97 阅读 · 0 评论 -
力扣之链表10—合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4# Definition for singly-linked list.class ListNode: def __init__(self, x): ...原创 2020-01-08 15:03:07 · 63 阅读 · 0 评论