![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
在线编程
开拓算法
这个作者很懒,什么都没留下…
展开
-
【leetcode】11 盛最多水的容器
题目分析双指针指向容器的两边,计算当前容积。因为容积的计算是高度较低的一边和底的长度决定的,所以移动低的边让容器有更大容积的可能。代码class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ l,r = 0,len(height)-1 maxarea = 0原创 2021-01-17 18:58:45 · 86 阅读 · 0 评论 -
【leetcode】65 x的平方根
题目分析x的平方根一定小于等于x(如果x等于1 则是等于)。所以可以从1到x的数遍历,这样的话复杂度是O(n)。既然是有序数组的查找,自然可以使用二分法来找数,每次选到的mid值如果mid的平方比x小,说明平方大于等于x的数在mid+1之后,此时让l=mid+1。如果mid的平方大于等于x,说明mid有可能就是第一个平方大于等于x的位置,此时让r=mid。最后当l==r时退出查找,判断r**2==8还是r**2>8来分别输出r或者r-1。题目class Solution(object):原创 2020-11-30 22:26:06 · 160 阅读 · 0 评论 -
【剑指offer】35 数组中的逆序数对
题目分析方法一(超时):暴力解法。每次找到最小值和其位置,逆序数+=其下标,然后剔除最小值。方法二:归并排序。[87654321],分成两个数组[8765]和[4321]每个数组的内部的逆序数对都是4,并排好序 [5678],[1234].然后合并他们得到[56781234]的逆序数对并排序。最终的逆序数对就是最大的两个区间合并起来算出的逆序数对。python代码# -*- coding:utf-8 -*-class Solution: def __init__(self):原创 2020-11-29 20:22:16 · 181 阅读 · 0 评论 -
【剑指offer】32 把数组排成最小的数
题目分析冒泡排序。以结果为最小数,排在最前面的数字的选择,应该是每次用第一位的数和后面的数组成两种情况 numbers[0]拼接numbers[j]或者numbers[j]拼接numbers[0],如果前者大,则不变这个位置,后者大则交换0和j的数字。这样遍历一遍后,第一位的数字就是必须排在最前面的。然后再按照这种拼接的方式取出排在第二位的数。依次选出所有位置的数字,返回结果。python代码class Solution: def PrintMinNumber(self, number原创 2020-11-28 22:53:09 · 109 阅读 · 2 评论 -
【剑指offer】29 最小的K个数
题目分析题目的意思很明确。这是典型的topk问题,可以维护一个最小堆,每次从堆的最顶端取数。建堆的过程是一个上浮的过程,每次把新的数放在最后面,依次找K/2父节点的位置,判断父节点和子节点 谁小,子节点小和父节点交换并且继续上浮,否则停止上浮。输出最小值的过程是一个下潜的过程,把根取出,把最后一位补在第一位。然后让根的数值下沉,每次通过k2和k2+1两个位置的子节点值和父节点值对比,如果父节点大则继续下沉,否则停止下沉。整道题就是先建堆,再取出堆的最小值,更新堆的过程。python代码cla原创 2020-11-28 22:13:52 · 106 阅读 · 2 评论 -
【剑指offer】42 和为S的两个数
题目分析左右指针,找到第一个和为S的两个数,返回他俩。python代码class Solution: def FindNumbersWithSum(self, array, tsum): # write code here l = 0 r = len(array)-1 while l < r: s = array[l]+array[r] if s<tsum:原创 2020-11-28 20:14:19 · 53 阅读 · 0 评论 -
【剑指offer】33 丑数
题目分析每个数乘以2,3,5 就会得到接下来的丑数,但是这个丑数不一定是正好可以排在后面的,所以有个采用不采用的情况。如果p2,p3,p5三个指针某个指针指导的数被采用了,这个指针后移一位。python代码class Solution: def GetUglyNumber_Solution(self, index): # write code here if index ==0: return 0 p2 = p3 = p5 = 0原创 2020-11-27 22:39:18 · 91 阅读 · 0 评论 -
【剑指offer】37 数字在有序数组中出现的次数
题目分析通过二分法分别找到两个区间第一个大于K的数为 right第一个大于等于K的数为left如果right大于left,返回right-left否则返回0注意右指针的位置一定要等于数组长度,以防发生 所有数都小于等于K的情况python代码class Solution: def GetNumberOfK(self, data, k): # write code here l,r = 0,len(data) while l<r原创 2020-11-27 22:06:51 · 62 阅读 · 0 评论 -
【剑指offer】27 字符串的全排列
题目分析遍历字符串,把每个字符当做第一个字符,其余的字符继续做全排列,最后去重排序python代码class Solution: def Permutation(self, ss): # write code here if not ss: return [] if len(ss)==1:return [ss] res = set() for i in range(len(ss)):原创 2020-11-27 21:45:07 · 50 阅读 · 0 评论 -
【剑指offer】48把字符串转换为整数
题目分析首先判断正负数然后从最后一位逐步加到结果上python代码class Solution: def StrToInt(self, s): # write code here if not s: return 0 i = 0 flag = True if s[0]=="-": flag = False i+=1 elif s[0]=="+":原创 2020-11-27 21:25:15 · 73 阅读 · 0 评论 -
【剑指offer】6 旋转数组中的最小数字
题目分析分为三种情况如果 mid>r,最小值一定在mid右边如果 mid ==r,最小值在 mid和r之间 r= mid -1如果 mid <r,最小值有可能是mid或者mid左边 r = midpython代码class Solution: def minNumberInRotateArray(self, rotateArray): # write code here l = 0 r = len(rotateArray)-原创 2020-11-26 23:28:10 · 48 阅读 · 0 评论 -
【剑指offer】1 二维数组中的查找
题目分析因为二维数组中每一个坐标为i,j的数,比它大的在下方,比它小的在左边。相当于二分查找中的mid值。所以 从右上角开始和target进行对比。当target比 i,j小的时候向左前进一步当target比i,j大的时候向下前进一步python代码class Solution: # array 二维列表 def Find(self, target, array): # write code here if not array:return Fa原创 2020-11-26 22:19:12 · 58 阅读 · 0 评论 -
【剑指offer】50 数组中重复的数字
题目分析用set检测是否有重复数字python代码class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # write code here s = set() flag = False for n in numbers:原创 2020-11-25 22:18:15 · 52 阅读 · 0 评论 -
【剑指offer】51 构建乘积数组
题目分析不能使用除法,那么就构建两个数组数组1 larr,第一位是1,其余位的数是A0A1…Ai-1数组2 rarr,最后一位是1,其余位是Ai+1Ai+2*…*An-1最后返回B,B的每一位是larr[i]*rarr[i]python代码class Solution: def multiply(self, A): # write code here larr = [] for i in range(len(A)):原创 2020-11-25 22:09:59 · 60 阅读 · 0 评论 -
【剑指offer】52 正则表达式匹配
题目分析设p为模式串,s为输入串。当p和s都是空串时,匹配。当p是空串,s不是空串的时候,不匹配当p当前字符不是*的时候–如果p当前字符是.,并且前面的字符都匹配,则当前匹配–如果p当前字符与s当前字符相等,并且前面的字符都匹配,则当前匹配如果p当前字符是时– 如果s当前字符与p去掉两个字符(包括和*前面的字符)时的字符相等,并且前面的字符都匹配,则当前匹配– 如果s当前字符与p去掉前一个字符(也就是*)相等,并且前面的字符都匹配,则当前匹配python代码class Solu原创 2020-11-24 23:46:20 · 810 阅读 · 0 评论 -
【剑指offer】53 表示数值的字符串
题目分析遍历,分析各种badcase情况,没啥技巧,要有耐心python代码class Solution: # s字符串 def isNumeric(self, s): # write code here hasE = False hasD = False for i, si in enumerate(s): if si == ".": if hasE:原创 2020-11-23 23:30:49 · 49 阅读 · 0 评论 -
【剑指offer】54 字符流中第一个不重复的字符
题目分析用一个队列维持 出现次数为1的字符顺序。用一个字典计算字符出现了1次,多次,还是0次。python代码class Solution: # 返回对应char def __init__(self): self.stock = {} self.queue=[] def FirstAppearingOnce(self): # write code here if len(self.queue)==0: ret原创 2020-11-22 19:17:56 · 57 阅读 · 0 评论 -
【剑指offer】 55 链表中环的入口结点
题目分析这是一道比较经典的快慢指针的问题,fast和slow都从头出发,他们第一次相遇时,fast刚好走了两倍slow的距离。如果此时有两个指针分别从头和相遇点出发,每次移动一步,当他们的相遇节点正好是环的入口。python代码# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def EntryNodeOfLoop原创 2020-11-21 15:39:24 · 55 阅读 · 0 评论 -
【剑指offer】56 删除链表中的重复节点
题目分析这道题的难点就是 容易碰到 2233这种连续要被删掉的节点,如果能够直接识别出这样的链路就可以直接指向3后面的节点了。python代码class Solution: def deleteDuplication(self, pHead): # write code here if not pHead: return None head = ListNode("#") head.next = pHead p原创 2020-11-20 21:34:26 · 42 阅读 · 0 评论 -
【剑指offer】57 二叉树的下一个节点
题目分析分两种情况讨论1,如果当前节点有右子节点,那么找到右子节点下的最左节点2,如果当前节点没有右子节点,那么向上递归寻找 pNode.next.left = pNode的形式 返回pNode,没找这种形式返回Nonepython代码class Solution: def GetNext(self, pNode): # write code here if not pNode: return None if pNod原创 2020-11-19 22:39:11 · 47 阅读 · 0 评论 -
【剑指offer】58 对称的二叉树
题目分析非递归的方法,每一层判断是不是回文序列递归的方法left.val == right.val 同时left.left.val == right.right.val 同时left.right.val == left.left.val满足这三个条件python代码非递归# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.le原创 2020-11-18 22:26:36 · 52 阅读 · 0 评论 -
【剑指offer】59 之字形打印树
题目分析bfs遍历树,同时当count%2等于0时正向打印,count%2等于1时逆向打印python代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def Print(self, pRoot):原创 2020-11-17 22:32:11 · 60 阅读 · 0 评论 -
【剑指offer】60 把二叉树打印成多行
题目分析bfs 遍历每层时 把这一层的节点加入数组,把数组加入结果中python代码class Solution: # 返回二维列表[[1,2],[4,5]] def Print(self, pRoot): # write code here if not pRoot: return [] res = [] arr = [pRoot] while(len(arr)!=0): te原创 2020-11-16 21:40:46 · 46 阅读 · 0 评论 -
【剑指offer】61 序列化二叉树
题目分析可以使用先序遍历和深度优先遍历序列化树,然后再逆过程反序列化python代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def Serialize(self, root): # writ原创 2020-11-15 16:21:54 · 56 阅读 · 0 评论 -
【剑指offer】62 二叉搜索树中的第k个节点
题目分析二叉搜索树的前序遍历刚好是节点值从小到大的排序。所以先使用前序遍历,然后输出第k个节点。前序遍历的过程为:维护一个栈和一个数组一个指向节点的指针1,从根开始,指针向左子树方向深入不断把节点压入栈中2,如果栈不为空,那么取出栈顶的节点,放入数组中,并且指针指向它的右子树。python代码class Solution: # 返回对应节点TreeNode def KthNode(self, pRoot, k): # write code here原创 2020-11-14 22:57:49 · 52 阅读 · 0 评论 -
[剑指offer] 63 数据流的中位数
题目分析使用二分法每次插入,插入的复杂度是logNpython代码class Solution: def __init__(self): self.num = [] def _insert(self,num): if len(self.num) == 0: self.num.append(num) elif len(self.num)==1: if num > self.num[原创 2020-11-12 22:44:28 · 54 阅读 · 0 评论 -
【剑指offer】65 矩阵中的路径
题目分析在矩阵中从0,0未知开始遍历,每次找到path的开头,开始dfs寻找path下一个字符是否在上下左右的位置。需要考虑的是边界条件:1,path寻找到尾部,存在路径返回true2,坐标超出矩阵范围,返回false3,坐标已经被加入路径,返回false4,坐标值等于path当前字符,将坐标加入路径4.1 如果dfs找到剩余路径,返回true4.2 如果没有找到剩余路径,将坐标退出路径, 返回falsepython代码class Solution: def __i原创 2020-11-11 23:42:11 · 92 阅读 · 0 评论 -
[剑指offer] 66 机器人的运动范围
题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?分析DFS边界条件:1,超界2,已经访问过3,和大于thresholdpython代码class Solution: def __i原创 2020-11-10 22:36:41 · 85 阅读 · 0 评论 -
[剑指offer] 67 剪绳子
[剑指offer] 67 剪绳子题目给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。(2 <= n <= 60)分析python代码class Solution: def cutRope(self, number):原创 2020-11-09 23:22:34 · 101 阅读 · 0 评论