自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 mac环境maven的安装与配置

mac环境maven的安装与配置下载及安装下载及安装下载 Maven, 并解压到某个目录(例如解压到/usr/local/apacheMaven),链接:https://maven.apache.org/download.cgi打开Terminal终端,输入以下命令,设置Maven classpath $ vi ~/.bash_profile在这个文件末尾加入一下路径配置:export M2_HOME=/usr/local/apacheMavenexport PATH=$PAT

2021-11-16 14:20:51 770

原创 二分类的评估指标

文章目录混淆矩阵指标准确率(Acc)召回率(Recall)精确率(Precision)f1真正类率(TPR)负正类率(FPR)KS值AUCGAUC曲线图recallPrecision曲线KS曲线ROC曲线混淆矩阵二分类的混淆矩阵TN:将负类预测为负类(真负类)FN:将正类预测为负类(假负类)TP:将正类预测为正类(真正类)FP:将负类预测为正类(假正类)指标准确率(Acc)俗称:样本中分对的占比即:测试样本中正确分类的样本数占总测试的样本数的比例召回率(Recall)俗称:

2021-06-18 11:27:08 1467 1

原创 动态规划系列2. 区域和检索 - 数组不可变python

文章目录题目题解题目最大子序和给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。题解假设需要求解的是i ~ j 的所有元素的和f(i,j),很明显可得知:f(i, j) = f(0, j) - f(0, i-1)此时如果我们保存一个数组,第j个位置存储了0~j-1 的和每一个位置都保存了sum数组前一位和原数组上一位的和,即:sum[i] = f(0, i-1)。根据这个sum数组,可以知道:f(i, j) = sum[j+

2021-04-21 11:48:11 227

原创 动态规划系列1.最大子序和python

文章目录题目一、递归题目不用加减乘除做加法一、递归

2021-04-21 11:32:28 192

原创 剑指offer实践 ——64.求1+2+···+n(python版)

文章目录题目一、递归题目求1+2+···+n一、递归递归的终止条件我们一般都会使用ifdef sumNums_1(n): return (n + sumNums(n-1)) if n>1 else 1但是题目明确要求了不能使用if有什么还可以用来终止循环呢? and(&)在python中, 1 and 0 = 0, 1 and 5 = 5def sumNums(n): return n and (n + sumNums(n-1))...

2021-04-20 16:07:54 196

原创 剑指offer实践 ——63.股票的最大利润(python版)

文章目录题目一、暴力二、动态规划题目股票的最大利润一、暴力便利所有可能的数组对,求出最大值def maxProfit_1(arr): if not arr: return 0 max_v = 0 for i in range(len(arr)): for j in range(len(arr)): if i<j and arr[j]-arr[i] > max_v:

2021-04-20 14:26:21 245

原创 剑指offer实践 ——62.圆圈中最后剩下的数字(约瑟夫环问题)(python版)

文章目录题目一、递归二、迭代题目圆圈中最后剩下的数字一、递归假设如下,n=5,此时要删除的数字为f(5, 3)去掉一个数字后要删除的数字为f(4,3)之后去掉一个数字后要删除的数字为f(3,3)之后去掉一个数字后要删除的数字为f(2,3)之后去掉一个数字后要删除的数字为f(1,3)只剩一个数字的时候需要删除的数字为f(0,3), 此时需要返回0这个时候递归到f(1,3) = 0, f(2,3) = (3+0)% 2 = 1这个时候递归到f(2,3) = 1, f(3,3)

2021-04-20 13:01:59 197

原创 剑指offer实践 ——61.扑克牌中的顺子(python版)

文章目录题目一、set二、排序题目扑克牌中的顺子一、set判断扑克牌是否是顺子只需要满足如下两个条件:1.排除大小王(0),最大值-最小值 < 52.排除大小王,没有重复元素重复元素的判断可以使用set和dict这两种,很明显不需要计数是选择set会更节省内存。遍历数组得到最大值和最小值~def isStraight(arr): '''扑克牌是否是顺子''' max, min = arr[0], arr[0] d = {} for num i

2021-04-19 20:15:38 559

原创 剑指offer实践 ——60.n个骰子的点数(python版)

文章目录题目一、递归二、动态规划题目n个骰子的点数一、递归二、动态规划假设投第一个骰子,可能的点数和为:1,2,3,4,5,6,概率都为1/6投第二个骰子,可能的点数和为2~12点数和为2,第一个骰子只能为1, 第二个骰子也只能为1,概率=1/6^2点数和为3,第一个骰子可以为1,2,第二个骰子分别为2,1, 概率=2*1/6^2点数和为4,第一个骰子可以为1,2,3,第二个骰子分别为3,2,1,概率= 3*1/6^2点数和为5,第一个骰子可以为1,2,3,4,第二个骰子分

2021-04-19 19:02:53 599 1

原创 剑指offer实践 ——59.2.队列的最大值(python版)

文章目录题目一、单调递减队列题目队列的最大值一、单调递减队列队列在push和pop的时候,已经是O(1)的时间复杂度。只是在取出max_value的时候,需要遍历整个队列来拿最大值。试想我们在:包含min函数的栈这一题中,使用了一个辅助栈来存储当前栈中的最小值。本题中,我们是否能使用一个辅助的数据结构来帮助我们在O(1)的时间拿到最大值呢?答案肯定是有的:单调递减队列。当一个元素进入队列的时候,它前面所有比它小的元素就不会再对答案产生影响。例如依次压入1,2,3,4。那这个队

2021-04-19 17:45:30 447 1

原创 剑指offer实践 ——59.1.和为s的连续正数序列(python版)

文章目录题目一、双指针实现滑动窗口题目滑动窗口的最大值一、双指针实现滑动窗口

2021-04-19 16:06:13 182

原创 剑指offer实践 ——58.2.左旋转字符串(python版)

文章目录题目一、简单暴力切片拼接题目左旋转字符串一、简单暴力切片拼接废话不说,直接看代码。。def reverse_left_words(s, n): if not s or n <= 0 or n > len(s): return None s = list(s) return ''.join(s[n:] + s[:n])...

2021-04-15 13:18:59 105

原创 剑指offer实践 ——58.1.翻转字符串(python版)

文章目录题目一、双指针题目翻转字符串一、双指针python中,字符串是不可以通过指针来改变的,如果把这个字符串放到list中,就可以实现反转了。def reverse(begin, end, s): while begin < end: tmp = s[begin] s[begin] = s[end] s[end] = tmp begin += 1 end -= 1 return s

2021-04-15 13:10:42 138

原创 剑指offer实践 ——57.2.和为s的连续正数序列(python版)

文章目录题目一、双指针实现滑动窗口题目和为s的连续正数序列一、双指针实现滑动窗口57.1.和为s的数字和为s的正整数序列一定是在【1,2,……,s-1】这个数组中出现的。仍旧设置两个指针:l,r 分别为1,2(因为这个子序列里至少有两个数字)。l -> r 的子序列的和 < s 时,r可继续扩展,+1l -> r 的子序列的和 > s 时,l+1l -> r 的子序列的和 = s 时, 将这个子序列放入结果中,l+1继续寻找l -> r 的子序

2021-04-15 11:35:01 123

原创 剑指offer实践 ——57.1.和为s的数字(python版)

文章目录题目一、双指针题目和为s的数字一、双指针仔细观察题目,这个数组是一个递增排序数组。例如:假设有两个指针分别指向数组的开始和结尾,那这两个指针分别指向的是数组的最小值和最大值。此时,如果两个指针指向的元素相加>数字s,那证明需要找一个更小的数字,此时第一个指针指向的是最小的数字,因此向左挪动第二个指针指向更小的数字。如果两个指针指向的元素相加<数字s,那证明需要找一个更大的数字,此时第二个指针指向的是最大的数字,因此向右挪动第一个指针指向更大的数字。直到两个指针

2021-04-15 11:03:22 126

原创 剑指offer实践 ——56.2.数组中唯一只出现一次的数字(python版)

文章目录题目一、哈希表+队列二、位运算三、位运算+有限状态自动机题目数组中唯一只出现一次的数字一、哈希表+队列简单明了,哈希表+队列def find_num_appear_once_1(arr): if not arr: return None d = {} q = [] for num in arr: if num not in d: d[num] = 1 q.append(

2021-04-15 10:49:50 251

原创 剑指offer实践 ——56.1.数组中只出现一次的两个数字(python版)

文章目录题目一、哈希表+队列二、异或题目数组中只出现一次的两个数字一、哈希表+队列简单明了,哈希表+队列def find_num_appera_once_1(arr): if not arr: return None d = {} queue = [] for num in arr: if num not in d: d[num] = 1 queue.append(num)

2021-04-14 20:16:02 263

原创 剑指offer实践 ——55.2.平衡二叉树(python版)

文章目录题目一、深度优先搜索 dfs题目平衡二叉树一、深度优先搜索 dfs继承上一题深度优先计算最大深度的思想:二叉树的深度如果左子树的深度和右子树的深度相差> 1,这一定不是一棵平衡二叉树。递归的去计算左子树和右子树是否是平衡二叉树。比较精巧的设计是,如果有一颗子树是不满足平衡二叉树的情况,返回-1。正常情况下没有一棵树的深度是-1,判断如果返回的值是-1,则证明存在不是平衡二叉树的子树。def is_balance(tree): if not tree:

2021-04-14 18:41:02 160

原创 剑指offer实践 ——55.1.二叉树的深度(python版)

文章目录题目一、深度优先搜索 dfs一、广度优先搜索(bfs)题目二叉树的深度一、深度优先搜索 dfs一棵二叉树的最大深度,一定是:max(左子树的最大深度+1, 右子树的最大深度+1)根据这个规律,可以写出如下递归求解的代码~# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass

2021-04-14 17:40:19 101

原创 剑指offer实践 ——54.二叉搜索树的第K大节点(python版)

文章目录题目一、中序遍历题目二叉搜索树的第K大节点一、中序遍历何为二叉搜索树?根据二叉搜索树的定义可以知道,二叉搜索树的中序遍历(中->根->右)正好是一个排序的list!!无巧不成书,遍历起来~# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:

2021-04-14 16:30:45 160

原创 剑指offer实践 ——53.3.数组中数值和下标相等的元素(python版)

文章目录题目一、二分查找题目数组中数值和下标相等的元素一、二分查找二分系列~:在排序数组中查找数字0~n-1中缺失的数字def get_num_same_as_index(arr): if not arr: return None n = len(arr) left, right = 0, n-1 while left <= right: mid = (left + right) // 2 if ar

2021-04-14 16:03:25 77

原创 剑指offer实践 ——53.2.0~n-1中缺失的数字(python版)

文章目录题目一、二分查找二、求和三、位运算四、暴力求解题目0~n-1中缺失的数字一、二分查找这一题和上一题有异曲同工之妙~53.1.在排序数组中查找数字def find_miss_num_1(arr): if not arr: return None n = len(arr) left, right = 0, n-1 while left <= right: mid = (left + right) // 2

2021-04-14 15:54:48 143

原创 剑指offer实践 ——53.1.在排序数组中查找数字(python版)

文章目录题目一、二分查找二、哈希表题目在排序数组中查找数字一、二分查找排序数组中查找数字,显而易见可以使用二分查找~~在定位到这个数字以后,分别向左右两个方向辐射寻找与目标数字相同的数字,计数~def find_num_in_arr_1(arr, k): if not arr: return 0 left, right = 0, len(arr) -1 while left <= right: mid = (left + ri

2021-04-14 15:18:40 181 2

原创 剑指offer实践 ——52.两个链表的第一个公共节点(python版)

文章目录题目一、两个栈二、 一个set二、 双指针循环题目两个链表的第一个公共节点一、两个栈两个链表如果有公共节点,则自第一个公共节点开始,后面的节点全部相同。def first_node_1(l1, l2): if not l1 or not l2: return None s1 = [] s2 = [] p1 = l1 p2 = l2 while p1: s1.append(p1) p1

2021-04-13 20:31:05 197

原创 剑指offer实践 ——51.数组中的逆序对(python版)

文章目录题目一、暴力遍历二、分治归并题目数组中的逆序对一、暴力遍历暴力遍历数组,每遍历到一个数字,遍历其后面的所有数字,判断是否组成逆序对。时间复杂度O(n^2)def inverse_pari_1(arr): if not arr or len(arr) == 1: return 0 res = 0 for i in range(len(arr)): for j in range(i+1, len(arr)):

2021-04-13 19:54:58 419

原创 剑指offer实践 ——50.2字符流中第一个只出现一次的字符(python版)

文章目录题目一、思路题目字符流中第一个只出现一次的字符一、思路解题思路详见:字符串中第一个只出现一次的字符class str_streaming(object): def __init__(self): self.s = '' self.d = {} self.queue = [] def add(self, s): self.s += str(s) if str(s) not in se

2021-04-12 18:09:10 98

原创 剑指offer实践 ——50.第一个只出现一次的字符(python版)

文章目录题目一、思路 利用哈希表+列表题目第一个只出现一次的字符一、思路 利用哈希表+列表分析一下这个题目。一个字符串中第一个只出现一次的字符。我们可以用一个dict来存储这个字符串中每一个字符出现的次数。把每一个第一次出现的字符压入列表尾部。一旦一个字符第二次出现,就将这个字符从列表中弹出。这样遍历一次字符串后,列表中的第一个元素就是第一次出现一次的字符。例如下列字符串“pwwkef”指针指向‘p’指针指向‘w’指针指向下一个‘w’def first_uniq_c

2021-04-12 17:56:07 415

原创 剑指offer实践 ——49.丑数(python版)

文章目录题目一、思路 暴力二、思路 动态规划题目丑数一、思路 暴力判断一个数是不是丑数,其实很简单。因子只包含2,3,5,因此只需要判断除完所有的2,3,5之后是不是留下了1。def is_ulgy_num(num): if num <= 0: return False while num % 2 == 0: num /= 2 while num % 3 == 0: num /= 3 whil

2021-04-12 17:00:09 167

原创 剑指offer实践 ——48.最长不含重复字符的子字符串(python版)

文章目录题目一、思路 双指针+哈希表二、思路 动态规划题目最长不含重复字符的子字符串一、思路 双指针+哈希表例如下列字符串:pwwkfe假设两个指针p1,p2分别指向字符串的-1和0。为什么要把p1指针指向-1,是因为在求字符串的长度时,如果字符串只有一位“a”, 那p2=0的时候,就需要计算不重复的最长长度,0-(-1)=1。因此p1这个指针代表的是不重复子串的前一位!!!开始遍历p2指针指向’p’,判断’p’是否在d这个字典中,没有压入字典,p2移动至下一个指针。更新当前的最

2021-04-09 19:09:19 198

原创 剑指offer实践 ——47.礼物的最大价值(python版)

文章目录题目一、思路 递归二、思路 动态规划题目礼物的最大价值一、思路 递归我们从棋盘的左上角开始移动,每次移动只有两种选择,向下或者向右。每次移动累计当前格子的数值。最终寻找到一个最大的路径走到右下角。这是一个递归的问题。每次移动都可以将接下来的向右或者向下的移动看成递归。在递归中,我们如何把最大的值保存下来?可以设计一个存储最大值的矩阵。例如:第一个位置(0,0)是起始位置,因此最大累计值只能是1我们先看行再看列第二个位置(1,0),只能是从(0,0)移动过

2021-04-09 15:08:20 220

原创 剑指offer实践 ——46.把数字翻译成字符串(python版)

文章目录题目一、思路 递归二、思路 动态规划题目把数字翻译成字符串一、思路 递归拿一个数字来分析:17232第一个字符假设为1,可以把数字分成2个部分来看:1、7232第一个字符假设为17,可以把数字分成2个部分来看:17、232,17恰好小于25,也可以转化,则第一个字符可以有2种情况,分别将7232和232递归计算,则【17232】这两个字符可能的情况就是7232字符可能翻译的种类加232可能翻译的种类。7232也可以对第一个字符进行相同的比较:第一个字符假设为7,可以把数

2021-04-08 20:30:45 292

原创 剑指offer实践 ——45.把数组排成最小的数(python版)

文章目录题目一、思路 快排题目把数组排成最小的数一、思路 快排最简单暴力的想法就是把这个数组的所有排列组合全部列出来,然后看是那一种组合的数值最小。但是如果能有更好的方法呢?有两个数字,a和b,ab > ba,则证明b比a小。例如:3, 21 321 > 213,则在我们最终想要的结果来看21是比3小的。能否定义一种新的比较大小的规则。这样就能套用任意种排序方法,将这个数组做一个排序,然后将排序后的字符串组合在一起,一定是这个最小值。该方法的具体论证请参照剑指

2021-04-08 16:43:28 310

原创 剑指offer实践 ——44.数字序列中某一位的数字(python版)

文章目录题目一、思路 找呀找呀找规律题目数字序列中某一位的数字一、思路 找呀找呀找规律由于数字是从0到无限的数字递增排列的,而0~9的数字只有一位,但是·10~99的数字有两位,100~999的数字有三位……因此给定一个n,确定在这个序列中第n位在什么位置,需要:1.确定这个n位在几位数字中2.确定这个n位在几位数字中的那一个数字中3.确定这个n位在几位数字中的那一个数字中的那一位例如:寻找第13位数字。0~9共有9个数字,而第13位>9,所以在10~99中寻找10~

2021-04-08 14:30:51 358

原创 剑指offer实践 ——43.1~n整数中1出现的次数(python版)

文章目录题目一、思路 暴力解法二、思路 递归题目1~n整数中1出现的次数一、思路 暴力解法遍历1~n的数字,每个数字通过取余和除法来判断数字中有多少个1。如果输入的数字n有def count_digit_one_1(n): if not n or n <= 0: return 0 res = 0 for i in range(1, n+1): print(i, one_nums(i)) res +=

2021-04-07 21:36:58 639 1

原创 剑指offer实践 ——42.连续子数组的最大和(python版)

文章目录题目一、思路 规律二、思路 动态规划题目连续子数组的最大和一、思路 规律要求时间复杂度在O(n),如果采用暴力方式,需要枚举所有可能出现的子数组,从而找到每一个子数组的和,来找到最大值。长度为n的数组有n*(n+1)/2 个子数组,这样我们需要花费O(n2)的时间复杂度。思考一下连续子数组最大和的问题。[1,-2,3, 10,-4, 7, 2, -5]初始化一个和s=0;初始化最大的子数组和max_sum为数组的第一个元素。假设我们从第一个元素开始累加。此时s=1,

2021-04-07 17:17:55 274 1

原创 剑指offer实践 ——41.数据流中的中位数(python版)

文章目录题目一、思路题目数据流中的中位数一、思路数据是流式的从数据容器中读取出来的,如果我们将它存储到一个数组中,需要查找中位数的时候,排序并查找,则排序需要的时间理想是O(logn),查找需要的时间O(1)。如果将流式的数据存储到排序的数组中,插入需要O(n)的时间,但是查找需要O(1)。思考一下中位数的特点。中位数的左边数字均小于中位数。中位数的右边数字均大于中位数。中位数左右两边的数字数量相等(偶数个长度的时候中位数取中间2位的平均值)因此如果我们在读取流式数据的时候,维护

2021-04-07 14:40:16 186 1

原创 快速排序、归并排序的python实现

快速排序的python实现快速排序其实是属于交换排序,不占用额外的空间,但是由于以来与原始的排序决定交换次数,因此也是一个不稳定的排序。在最好的情况下是O(logn), 但是在最坏的情况下是O(n2)。快排的步骤:在数组中选一个基准数(通常为数组第一个);将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。假设如下的list: 3,5,7,1,4首先设置基准值为3,则最终比3小的

2021-04-06 18:44:32 448

原创 剑指offer实践 ——40.最小的k个数(python版)

文章目录题目一、思路 排序二、思路 利用容器题目最小的k个数一、思路 排序对输入的数组做排序,然后找出排序后的前4个数。贴一下各个排序算法的时间复杂度:本例使用快速排序来实现最小的k个数,其他排序见:def partition(arr, low, high): i = (low - 1) # 最小元素索引 pivot = arr[high] for j in range(low, high): # 当前元素小于或等于 pivot

2021-04-02 18:56:59 211

原创 剑指offer实践 ——39.数组中出现次数超过一半的数字(python版)

文章目录题目一、思路 遍历计数二、思路题目数组中出现次数超过一半的数字一、思路 遍历计数通过时间复杂度为O(n)的遍历,来存储数组中每一个数字出现的次数。再使用一个max,和max_num的变量来存储当前遍历的最大次数的数字。因为数组中一定存在一个出现次数超过一半的数字,因此计数次数最大的数字就是这个数字。时间复杂度为O(n)空间复杂度为O(n)def more_than_half_num_1(arr): if not arr: return None

2021-04-02 18:26:12 96

原创 剑指offer实践 ——38.字符串的排列(python版)

文章目录题目一、思路 递归题目字符串的排列一、思路 递归从人的角度来看a,b,c有多少种排列,首先看第一位有多少种可能。固定第一位之后,在剩下的字符中去筛选第二位有多少种可能。固定第一位和第二位后,看第3,4,5……n位贴一张力扣大神的图~~~通过这样的方式,很容易能想到递归去实现这个问题。首先探索第一位的所有可能,在固定了第一位以后,递归的去寻找第二位的所有可能……def permutation(s): if s == '' or s is None:

2021-04-02 17:14:10 149 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除