自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

yanglee0

数据分析、数据挖掘

  • 博客(45)
  • 收藏
  • 关注

原创 剑指offer56、删除链表中重复的结点

删除链表中重复的结点还有种暴力解法:1、把所有节点的值放到一个列表中,再筛选出值数量为1的值。2、再返回一个链表。# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def deleteDuplication(self, pHead): # write co

2020-11-18 10:48:35 18

原创 剑指offer61 序列化二叉树

序列化二叉树序列化:把内存的代码,持久化成字符串反序列化:把字符串,变成内存对象解题思路:树的序列化:先序遍历, “#” 表示占位,当前的值加上下划线 “,”树的反序列化:利用闭包的特性,加上队列弹出的优点 使用Python实现很优雅,很happy# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#

2020-11-18 10:27:16 9

原创 剑指offer63、数据流中的中位数

数据流中的中位数虽然这种思路可以写粗来,但是面试的时候应该还是要用别的方法,比如两个堆。1、append到数组中,进行排序2、判断奇数个还是偶数个,然后进行分别处理。# -*- coding:utf-8 -*-class Solution: def __init__(self): self.arr = [] def Insert(self, num): # write code here self.arr.append(num)

2020-11-18 10:03:22 5

原创 剑指offer65 矩阵中的路径(回溯法,记忆)

矩阵中的路径

2020-11-18 10:00:45 6

原创 剑指offer62 二叉搜索树的第K个节点

二叉搜索树的第K个节点# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # 返回对应节点TreeNode def KthNode(self, pRoot, k): # write code here

2020-11-18 09:40:05 3

原创 剑指offer49 把字符串转换为整数

把字符串转换为整数根据上面的描述,我们大概有了几点思路:开头空格要去掉正负号要判断一下第一个非空字符必须是数字/正负号要限制数字大小前面的判断完后,尾部还要进行判断,比如前面是数字,后面突然出现其他符号,后面的全部丢掉不看了。(剑指Offer直接return 0,但是LeetCode会让返回前面已有的数据)# -*- coding:utf-8 -*-class Solution: def StrToInt(self, s): # write code he

2020-11-17 16:46:01 12

原创 剑指offer34 第一次只出现一次的字符

这里采用简答的方法。也可以采用哈希表的方法。# -*- coding:utf-8 -*-class Solution: def FirstNotRepeatingChar(self, s): # write code here if len(s) < 0: return -1 for i in s: if s.count(i)==1: return s.inde.

2020-11-17 16:14:14 11

原创 剑指offer27 字符串的排列(记忆)

字符串的排列# -*- coding:utf-8 -*-class Solution: def Permutation(self, ss): # write code here if len(ss)<=1: return ss res = []# res = set() # 遍历字符串,固定第一个元素,第一个元素可以取a,b,c...,然后递归求解 for i in

2020-11-17 15:58:12 5

原创 剑指offer33 丑数

丑数对丑数进行列举,30,20,15数字可以换,如果太大,时间复杂度可能会超过;如果太小,有些数字可能会漏掉。例如,对于我挑的30、20、15这三个数。是不可能出现231的,但是(229) *(51)反而大于231,所以231就会被漏掉。如果题目正好找的是231,那么实际返回的会是比它大的数。这个时候就要再增加这三个数了# -*- coding:utf-8 -*-class Solution: def GetUglyNumber_Solution(self, index):

2020-11-17 15:36:56 3

原创 剑指offer13、 调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面思路:1、设两个空的数组,一个存放奇数odd,一个存放偶数even2、遍历,判断为奇数还是偶数,分别append到对应的数组中3、返回odd+even数组# -*- coding:utf-8 -*-class Solution: def reOrderArray(self, array): # write code here if array == None: return odd =

2020-11-17 15:08:07 3

原创 剑指offer66 机器人的运动范围

机器人的运动范围思路:将地图全部置1,遍历能够到达的点,将遍历的点置0并令计数+1.这个思路在找前后左右相连的点很有用,比如leetcode中的海岛个数问题/最大海岛问题都可以用这种方法来求解。# -*- coding:utf-8 -*-class Solution: count = 0 def movingCount(self, threshold, rows, cols): # write code here arr = [[1 for i in

2020-11-17 14:57:02 5

原创 剑指offer50 数组中重复的数字

解法一:利用字典(哈希)# -*- coding:utf-8 -*-class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # write code here dic={} flag = False for i in numbers: .

2020-11-16 15:39:38 4

原创 剑指offer51、 构建乘积数组

构建乘积数组思路:按上图把每行被1分割的两部分乘积都计算出来,这样可以从首尾分别用累乘算出两个列表,然后两个列表首尾相乘就是B的元素# -*- coding:utf-8 -*-class Solution: def multiply(self, A): # write code here head = [1] tail = [1] for i in range(len(A)-1): head.app

2020-11-16 15:09:41 10

原创 剑指offer31、整数中1出现的次数(从1到n中出现整数中1出现的次数)(单独理解下)

# -*- coding:utf-8 -*-class Solution: def NumberOf1Between1AndN_Solution(self, n): # write code here cnt, i = 0, 1 while i <= n: # i 依次个十百位的算,直到大于 n 为止。 cnt += n // (i * 10) * i + min(max(n % (i * 10) - i + 1, ..

2020-11-12 15:21:14 3

原创 剑指offer10、矩形覆盖

本题本质是斐波那契数列。采用递归的方式。按照递归的几个步骤来即可。# -*- coding:utf-8 -*-class Solution: def rectCover(self, number): # write code here # 1 1个2*1小矩形覆盖2*1大矩形 = 1 # 2 2个2*1小矩形覆盖2*2大矩形 = 2 # 3 3个2*1小矩形覆盖2*3大矩形 = 3 # 4 4个2*1小矩形覆盖2..

2020-11-12 10:40:51 5

原创 剑指offer12、数值的整数次方

12、数值的整数次方没有太多东西,细致一点,考虑全面就可以了。逻辑是比较简单的。# -*- coding:utf-8 -*-class Solution: def Power(self, base, exponent): # write code here # 0的0次方和0的负数次方无意义 temp = base if base == 0 and exponent <= 0: return Non

2020-11-10 11:17:02 4

原创 剑指offer 11、二进制中1的个数

11、 二进制中1的个数# -*- coding:utf-8 -*-class Solution: def NumberOf1(self, n): # write code here if n<0: n = n&0xffffffff return bin(n).count('1')

2020-11-10 10:56:49 7

原创 剑指offer 25、26

25、复杂链表的复制 26、二叉搜索树与双向链表

2020-08-14 15:06:04 74

原创 剑指offer 52、53、54

52、正则表达式匹配解这题需要把题意仔细研究清楚,反正我试了好多次才明白的。首先,考虑特殊情况: 1>两个字符串都为空,返回true 2>当第一个字符串不空,而第二个字符串空了,返回false(因为这样,就无法 匹配成功了,而如果第一个字符串空了,第二个字符串非空,还是可能匹配成 功的,比如第二个字符串是“a*a*a*a*”,由于‘*’之前的元素可以出现0次, 所以有可能匹配成功)之后就开始匹配第一个字符,这里有两种可能

2020-08-13 16:38:42 39

原创 动态规划清晰理解

1. 从一个生活问题谈起2. 几个简单的概念3. DP的典型应用:DAG最短路4. 对DP原理的一点讨论5. 例题:最长上升子序列

2020-08-13 15:50:18 22

原创 剑指offer 41、42

41、和为S的连续正数序列考虑用滑动窗口,知识补充:1、什么是滑动窗口?顾名思义,首先是一个窗口,既然是一个窗口,就需要用窗口的左边界i和右边界j来唯一表示一个窗口,其次,滑动代表,窗口始终从左往右移动,这也表明左边界i和右边界j始终会往后移动,而不会往左移动。这里我用左闭右开区间来表示一个窗口。比如2、滑动窗口的操作扩大窗口,j += 1缩小窗口,i += 1算法步骤:– 初始化,i=1,j=1, 表示窗口大小为0– 如果窗口中值的和小于目标值sum, 表示需要扩大窗口,j +=

2020-08-12 21:58:39 50

原创 剑指offer 57、58、59、60

57、58、59、60、

2020-08-11 09:38:26 39

原创 剑指offer 46、47、48

46、圆圈中最后剩下的数解法1:找规律。首先定义最初的n个数字(0,1,…,n-1)中最后剩下的数字是关于n和m的方程为f(n,m)。在这n个数字中,第一个被删除的数字是(m-1)%n,为简单起见记为k。那么删除k之后的剩下n-1的数字为0,1,…,k-1,k+1,…,n-1,并且下一个开始计数的数字是k+1。相当于在剩下的序列中,k+1排到最前面,从而形成序列k+1,…,n-1,0,…k-1。该序列最后剩下的数字也应该是关于n和m的函数。由于这个序列的规律和前面最初的序列不一样(最初的序列是从0开始的

2020-08-09 17:10:59 67

原创 剑指offer37、38、39

37、数字在排序数组中出现的次数适用于初学者的解法方法:暴力循环法。对数组进行遍历,如果遍历中的数组的值等于k,则计数+1# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): # write code here count = 0 for i in range(len(data)): if data[i]==k:

2020-08-09 14:02:00 58

原创 剑指offer64、32、35、40 数组

64、滑动窗口的最大值32、把数组排成最小的数1.先要判断输入数组是否是空2. 把原来的数组变成一个字符串数组3.定义一个比较的规则:例如[“3”,“32”]中332>323,所以要将3和32的位置调换,对于有三个数字的情况:对于有三个数字的情况: [3,32,321],首先将3和32进行调换,变为[32,3,321],然后这里用的是冒泡排序的做法,再将32与321进行组合,因为32132<32321,所以将32与321进行调换,接着,332>323,所以将3与32调换,最后[

2020-08-07 19:46:49 37

原创 查找 剑指offer6 旋转数组的最小数字

# -*- coding:utf-8 -*-class Solution: def minNumberInRotateArray(self, rotateArray): # write code here if len(rotateArray)== 0: return 0 for i in range(len(rotateArray)): if rotateArray[i]>rotateArra.

2020-08-07 19:40:02 30

原创 XGBOOST常见问题以及面试题

1. 树该怎么长很有意思的一个事是,我们从头到尾了解了xgboost如何优化、如何计算,但树到底长啥样,我们却一直没看到。很显然,一棵树的生成是由一个节点一分为二,然后不断分裂最终形成为整棵树。那么树怎么分裂的就成为了接下来我们要探讨的关键。对于一个叶子节点如何进行分裂,XGBoost作者在其原始论文中给出了一种分裂节点的方法:枚举所有不同树结构的贪心法不断地枚举不同树的结构,然后利用打分函数来寻找出一个最优结构的树,接着加入到模型中,不断重复这样的操作。这个寻找的过程使用的就是贪心算法。选择一个fea

2020-08-06 10:15:52 214 1

原创 剑指offer 19、28、29、30

19、28、29、30、

2020-08-05 22:53:45 28

原创 XGBOOST理论理解

Xgboost属于集成算法。复习一下:1、 xgboost树的定义举个例子,我们要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示。就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 =

2020-08-05 15:46:00 98

原创 剑指offer 22、23、24

22、23、24、

2020-08-04 09:45:13 24

原创 剑指offer 17、18

17、 树的子结构18、二叉树的镜像

2020-08-03 20:31:19 40

原创 剑指offer 43、44、45

43、44、反转单词顺序列牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:以空格为分界符,切分字符串可以得到一个字符串数组,对数字逆序遍历进行拼接。# -*- coding:utf-

2020-07-31 15:34:27 35

转载 GRU原理理解

1. 什么是GRUGRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。GRU和LSTM在很多情况下实际表现上相差无几,那么为什么我们要使用新人GRU(2014年提出)而不是相对经受了更多考验的LSTM(1997提出)呢。在我们的实验中选择GRU是因为它的实验效果与LSTM相似,但是更易于计算。简单来说就

2020-07-30 17:13:02 247

转载 LSTM原理详解

0. 从RNN说起循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。1. 普通RNN先简单介绍一下一般的RNN。其主要形式如下图所示(图片均来自台大李宏毅教授的PPT):2. LSTM2.1 什么是LSTM长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,

2020-07-30 16:09:29 67

原创 剑指offer 5、20、21、44

5、20、21、44、

2020-07-28 11:05:09 28

原创 RNN循环神经网络(非常好理解)

神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下:将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢?**为什么需要RNN(循环神经网络)**他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理解一句话意思时,孤立的理解这

2020-07-27 10:41:27 51

原创 剑指offer 7、8、9

7、大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39斐波那契数列的标准公式为:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N)*public class Solution { public int Fibonacci(int n) { if(n<=1){ return n; } return F

2020-07-23 09:46:17 22

原创 剑指offer 14、15、16 、25、36、55、56 链表

14、输入一个链表,输出该链表中倒数第k个结点。方法二:严格的O(n)解法,快慢指针如下图:我们从图中可以看出,倒数第k个节点与最后的空节点之间有2个指针,此时的2正好就是k,于是我们可以想到可以通过平移来到达最后的状态。如图:如果懂了上面的过程,接下来再说说具体编程要怎么写?使用如图的快慢指针,首先让快指针先行k步,然后让快慢指针每次同行一步,直到快指针指向空节点,慢指针就是倒数第K个节点。/*public class ListNode { int val; List

2020-07-23 09:35:30 31

原创 KNN算法思路以及常见面试题

一.KNN算法概述KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学习算法)。关于K-means可以看上篇博客。二.KNN算法介绍KNN的全称是K Nearest Neighbors,意思是K个最近的邻居,K的取值肯定是至关重要的。其实啊,KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。如下图,k=3时候,绿色x判定为蓝色。

2020-06-02 14:05:55 258

原创 k-means常见面试题

总述关于K-means在面试中常见的问题先汇总一下,下面分别详细说明。1、简述一下K-means算法的原理和工作流程2、K-means中常用的到中心距离的度量有哪些?3、K-means中的k值如何选取?4、K-means算法中初始点的选择对最终结果有影响吗?5、K-means聚类中每个类别中心的初始点如何选择?6、K-means中空聚类的处理7、K-means是否会一直陷入选择质心的循环停不下来?8、如何快速收敛数据量超大的K-means?9、K-means算法的优点和缺点是什么?一、

2020-06-01 16:07:12 744

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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