![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
weixin_43164504
这个作者很懒,什么都没留下…
展开
-
数组中的逆序对
数组中的逆序对题目:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序 对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、 (7,5)、(7,4)、(6,4)和(5,4)。分析:迭代求解的三个要素:1.每一步迭代需要做的事情2.迭代的输入和返回值3.迭代的终止条件# give a arr, get all inverse pairs# use recurse, for a arr ->#原创 2021-08-15 12:26:40 · 42 阅读 · 0 评论 -
最长不含重复字符的子字符串-动态规划
最长不含重复字符的子字符串-动态规划题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计 算该最长子字符串的长度。假设字符串中只包含a~z的字符。例如,在字 符串" arabcacfr’“中,最长的不含重复字符的子字符串是"acfr”,长度为4。分析:见代码# find max length substr which have no duplicate elements# dp, a question: if there is a long substr satisfy, and this原创 2021-08-12 12:56:51 · 146 阅读 · 0 评论 -
礼物的最大价值-动态规划
礼物的最大价值-动态规划题目:在一个mn的棋盘的每一格都放有一个礼物,每个礼物都有 定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并 每次向左或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其 上面的礼物,请计算你最多能拿到多少价值的礼物?分析:典型二维动态规划问题,由于中间任意只能从左侧或者上侧过来,所以只有两种传递方案# from left-up to right-down, every step can only go down or go right -># s原创 2021-08-12 11:33:24 · 77 阅读 · 0 评论 -
数组翻译成字符串有多少种方法-动态规划
数组翻译成字符串有多少种方法-动态规划题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成 “a”,1翻译成“b”,……,11翻译成“1”,……,25翻译成“z”。一个数 字可能有多个翻译。例如,12258有5种不同的翻译,分别是“ bcci”、“bwf” “bczi”、“mcf”和“mzi”。请编程实现一个函数,用来计算一个数字有多 少种不同的翻译方法分析:数字最大到25,因此只有两种划分方式,建立F(i)和F(i-1)以及F(i-2)的递推关系即可# give a num, 0 can原创 2021-08-12 11:10:55 · 87 阅读 · 0 评论 -
连续子数组的最大和-动态规划
连续子数组的最大和-动态规划题目:输入一个整型数组,数组里有正数也有负数。数组中的一个或 连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复 杂度为O(n)分析:当数组中只有一个元素时,最大和为该元素的值;设dp(i)为目标数组中下标从0到i的一段,代表该数组的连续子数组的最大和,则有以下两种情况:1.当dp(i-1)大于0时,dp(i)=dp(i-1)+oriArr[i],2.否则dp[i]=oriArr[i]## method: dp# Fi present in arr[0-i]原创 2021-08-12 10:00:21 · 218 阅读 · 0 评论 -
找到二叉树所有和为指定值的路径
使用前序遍历可以获得所有到达叶子结点的路径注:代码中使用的Tree2类可以从链接中获取# form a binary treeimport Tree2tree = Tree2.BinTree()for i in range(1,9): tree.add(i)tree.add(10)tree.add(9)# tree.out_value_levelorder()# find a path, sums of nums in these paths equal the target v原创 2021-08-09 15:47:35 · 55 阅读 · 0 评论 -
python实现基本二叉树结构,实现层序遍历
binary Tree# define a nodeclass Node: def __init__(self,data): self.data = data self.left = None self.right = Noneclass BinTree: def __init__(self): self.root = None self.left = None self.right = None self.ls = [] # use the new node to a原创 2021-08-09 14:33:02 · 58 阅读 · 0 评论 -
binary tree
简单二叉树结构class Node: def __init__(self,data): self.data = data self.left = None self.right = None return class Tree: def __init__(self): self.head = None self.left = None self.right = None原创 2021-07-06 00:17:22 · 26 阅读 · 0 评论 -
2021-07-03
数组操作问题题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。分析:可以发现 奇数字放左边 偶数放右边 正好是互换操作 因此可以双指针 从两头往中间或者中间往两头exp = [1,2,3,4,5,6,7,8]def change_pos(exp): length = len(exp) midIndex = length//2 leftIndex = 0 rightIndex = length-1原创 2021-07-03 21:14:44 · 110 阅读 · 0 评论 -
2021-07-01
删除链表中指定值的节点分析:1.找到该节点的前节点2.将该节点后节点的值复制过来,并删除其后节点class Node: def __init__(self,data): self.data = data self.next = None returnclass linklist: def __init__(self): self.head = None self.tail = None原创 2021-07-01 23:06:02 · 32 阅读 · 0 评论 -
2021-06-30
python自定义链表结构并实现基本操作# define a node classclass Node: def __init__(self,data): self.data=data self.next=None return# define a linklistclass linklist: def __init__(self): self.head=None self.tail=None原创 2021-06-30 23:26:10 · 87 阅读 · 2 评论 -
2021-06-28
动态规划题目:‘’’给你一根长度为的绳子,请把绳子剪成段(m、都是整数 m>1并且m>1),每段绳子的长度记为AO이A]…A서m』请问AO)xy×- m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长 度分别为2、3、3的三段,此时得到的最大乘积是18‘’’分析:假设n长度的时候,得到的最优解为f(n),则f(n)= max(f(i)f(n-i))这样是递归的思路可以“从下自上”的方式去计算,储存最优解在数组中,避免递归def maxmuti(n): #原创 2021-06-28 23:19:25 · 55 阅读 · 0 评论 -
2021-06-28
backtrace2题目:地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开 始移动,它每次可以向左、右、上、下移动一格,但不能进入行坐标和列 坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 (35,37),因为3+5+3+7=18。但它不能进入方格(3,38),因为3+5+3+8-19。请问该机器人能够到达多少个格子?分析:回溯法import numpy as np# use backtrace# check if the robot can go a po原创 2021-06-28 00:27:08 · 32 阅读 · 0 评论 -
2021-06-23
backtrace题目: 给定一个二维数组,给定一个序列,找到数组中该序列的路径,例如:数组:[[ 1 2 3 4][ 5 6 7 8][ 9 10 11 12]]序列:[1, 2, 3, 7, 6, 10, 11, 12]分析:回溯法# use list to simulate stack# s = list()# s.append(4)# s.append(5)# print(s)# s.pop()# print(s)import numpy as np原创 2021-06-23 12:46:37 · 29 阅读 · 0 评论 -
2021-06-22
二分法查找旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为 数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小 元素。例如,数组34,5,1,2为1,2,3,4,5}的一个旋转,该数组的最小 值为1。分析:使用二分法,查找效率高def smallestValue(arr): print(arr) length = len(arr) if length==1: return arr[0] if length==2原创 2021-06-22 00:45:28 · 47 阅读 · 0 评论 -
2021-06-20
快速排序分析:选择锚点,一次分成两部分,之后对剩下的子序列做同样的操作# quick sortdef partition(nums,start,end): # attention the small position and end position if start>end: return small = start-1 for index in range(start,end): if nums[index]<nums[en原创 2021-06-20 22:03:08 · 31 阅读 · 0 评论 -
2021-06-18
快速排序题目: 实现快递排序分析:无# quick sortdef partition(nums,start,end): # attention the small position and end position small = start-1 for index in range(start,end): if nums[index]<nums[end]: small+=1 # if small!=inde原创 2021-06-18 23:52:53 · 29 阅读 · 0 评论 -
2021-06-18
剑指offer,febonacci题目:给定n,求斐波那契数列的第n项分析:可以用递归的思路做,但是复杂度太高,可以从前往后运算,储存在数组中,以空间换时间# fibonaccidef get_fibo(n): start = [0,1] if n<=1: return start[n] for i in range(2,n+1): start.append(start[i-2]+start[i-1]) print(start)原创 2021-06-18 21:59:02 · 42 阅读 · 0 评论 -
2021-06-17
二叉树前中后三序题目:找出指定节点的下一个节点分析:首先画三层不规则二叉树图,然后模拟中序:父节点,右子树下的最左节点,若自己为右子节点,且没有右子树,则上溯找到父节点作为左子树的节点,其父节点为下一个节点。前序:左子节点,右兄弟节点,两者都无的上溯找到父节点作为左子树的节点,其父节点的右子节点为下一个节点。后序:右子树的最左节点,无右子树则父节点。...原创 2021-06-17 19:59:14 · 70 阅读 · 0 评论 -
2021-06-17
剑指offer,page62题目:根据前序和中序,重建二叉树分析:树的问题用递归去做,重点在于构造最小结构。对前序,第一个是root,剩下是左子树和右子树,对中序,是左子树-root-右子树,因此可以抓住rootlevelorder = []def rebuildTree(preorder,inorder): for x in range(len(inorder)): if inorder[x].value==preorder[0].value: # find the root l原创 2021-06-17 19:10:00 · 31 阅读 · 0 评论 -
2021-06-17
剑指offer,page44题目:一个矩阵,从左到右和从上到下都是增加的,判断给定的数是否在矩阵中分析:如果从左上角开始看,发现比target小,则只能说明target在该位置的下方或者右方;如果从右上角开始看,发现比target大,则可以直接排除一列,往下走,如果发现比target小,则可以排除一整行。def findNum(matrix,num): rows = len(matrix) cols = len(matrix[0]) # go up, go right原创 2021-06-17 18:36:43 · 35 阅读 · 0 评论 -
2021-06-15
剑指offer,page41题目:数组长度为n+1,数组中元素范围为1-n,找出一个重复的数分析:使用二分查找,找到1-n范围最中间的那个数,二分这个范围,找到范围之一。例如:将范围二分为[1,m],[m+1,n],如果数组在[1,m]范围的元素个数超过m,则重复发生在1-m之间def countnum(arr,start,end): count=0 for i in range(len(arr)): if arr[i]>=start and arr[i]<=end: cou原创 2021-06-17 18:01:43 · 39 阅读 · 0 评论