自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

恒河沙无数

面壁十年终破壁,难酬蹈海亦英雄

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

原创 Course Schedule

leetcode第207题,给定一组课程的互相的优先关系,判断是否可以满足课程上完的要求。这个问题很典型是拓扑排序,抽象出来就是每个课程都是一个节点,题目的意思就是经过拓扑排序之后去掉节点后图中是否还有剩余,如果有说明图中存在环结构。拓扑排序思想很简单,图中节点有优先关系,将入度为零的节点加入队列,然后与这个节点相关的节点入度自动递减,重复上述过程,如果满足图中无环的情况,就应该会没有节点

2016-08-19 17:39:45 280

原创 Palindrome Partitioning

leetcode第131题,要求分割一个给定的字符串,要求分割后的字符串都是回文串,列举出所有可能。这道题确实是一道典型的回溯题目,首先理解对题意,是分割字符串,而不是在字符串中找出所有的回文子串,因此这样难度会降低不少。分析问题,第一步,递归出口条件,应当是所有字符串都用完了,就意味着分割结束了,要把结果加入结果列表中。回溯的流程是,先对当前字符串从开头遍历,一旦发现出现了回文子串,立刻

2016-08-19 09:14:45 203

原创 Combination Sum

leetcode第39题,回溯题,要求用给定集合中的数字使得相加等于目标数字,其中给定集合中的数字可以无限次使用。注意,这里题目要求所有数字都是正数,这就保证了递归的出口条件。分析问题,首先,递归的出口条件有两个,一个是相加出现了目标和,那么就加入了结果列表,返回。另外,由于给定集合都是正数,所以相加如果超过了目标和,就要立即返回。然后遍历集合,不断向下递归搜索。还有一个比较关键的问题

2016-08-17 10:58:45 205

原创 Combinations

leetcode第77题,排列组合题升级版,这个题的总体难度不太大,但是鉴于使用的是python,如果不剪枝,就一定会超时。首先分析问题,先要按顺序挑选出开头的元素,此时所给集合中的所有元素均可以添加,然后把加上了开头元素的列表向下递归,添加第二个元素,第二个元素的要求应该是第一个元素之后的所有元素均可,同时记录递归层级的变量level自增。递归的出口条件是,当level达到了指定的个数后,数

2016-08-17 10:14:34 216

原创 Remove Duplicates from Sorted Array II

leetcode第80题,这个题目是之前第26题的升级版,在原来的基础上要求可以允许两个重复的情况出现。其实这样也并不是很苦难,只是在原来的基础上要多增加一个计数器,来计数出现重复数字的个数,一旦重复计数超过两个,就当做一个来看待,最后当再次出现不重复情况的时候,这个计数器就归零。class Solution(object): def removeDuplicates(self,

2016-08-17 08:24:03 204

原创 Sum of Two Integers

leetcode第317题,位运算题,在不使用加法和减法的情况下运算加法。很明显就是一个位运算,首先这样分析,位运算就这么几种,与、或、非、异或、移位。选择哪一种是关键。首先加法肯定要所在位的数值相加,异或可以完成这个功能,但是异或没有进位怎么办,用与操作就可以获取进位值出现在哪一位。但是进位制出现在哪一位,加上这一位进位值的是下一位,因此还需要移位操作。程序的流程是先进行与操作,提出进位

2016-08-16 15:26:30 235

原创 Ransom Note

leetcode第383题,这道题比较简单,其实就是查字典问题,字典中必须有足够多的字母来满足写信的要求,同时还要具备应该有的字母。直接上代码吧。class Solution(object): def canConstruct(self, ransomNote, magazine): """ :type ransomNote: str

2016-08-16 09:58:17 351

原创 Search for a Range

leetcode第34题,二分查找,由于限制住了复杂度为O(nlogn),因此线性查找肯定不行了,必须使用二分。二分查找算法原理不难,但是在实际编码的过程中边界是需要好好处理的一个地方,另外,二分查找后只找出了一个目标元素,需要做的就是在这个元素的基础上向两边继续搜索是否还有相等的元素即可。class Solution(object): def searchRange(self,

2016-08-16 09:36:31 196

原创 Path Sum

leetcode第112题,二叉树搜索问题,计算从根到叶子节点路径之和与目标数比较。这道题难度不大,只要是深搜就可以了,废话不说,直接上代码吧。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x#

2016-08-15 09:59:01 188

原创 Restore IP Addresses

leetcode第93题,计算有效的IP地址。分析问题,首先什么是有效的IP,这里有效是广义的,也就是凡是符合IP的要求的都算,不考虑特殊IP地址的限制。这样有效IP的要求就放宽了不少,首先IP应该有四级,每一个的数字都应该在0-255之间,还有一点比较隐蔽,那就是0单独出现时正确的,但是如“”010”这样的数字就是不合法的了。确认有效IP的格式后,就要分析算法,这里运用深度搜索,递归出口

2016-08-15 09:12:08 167

原创 Partition List

leetcode第86题,分割链表,将小于指定数字的部分和大于等于指定数字的部分放在链表两边。这个题难度不大,很简单的考虑思路就是遍历整个链表,凡是小于指定数字的加入一个新的链表中,其余的加入另一个链表中,最后合并两个链表就可以了。这里要注意两种极端情况。一是如果整个链表都大于指定数字,一个是整个链表都小于指定数字。# Definition for singly-linked list

2016-08-10 09:32:37 200

原创 Invert Binary Tree

leetcode第226题,反转二叉树,这个题看上去有点难,但是实际上很简单。反转二叉树,无非就是交换所有的左孩子与右孩子,只要对每一个节点的子节点都进行一轮这样的操作就可以了,不过要注意递归的出口条件,那就是到达叶子结点,也就是既没有左孩子也没有右孩子,有时候有的子节点可能是空的,因此出口条件是或的关系。# Definition for a binary tree node.# class

2016-08-10 08:51:19 170

原创 Search Insert Position

leetcode第35题,典型的二分查找,这里不但要查找存在的元素,对于不存在的元素还要找出其插入的位置。很明显,使用二分查找,二分查找可以自然地返回不存在元素插入的位置。我的代码有一些不完备,加了一点补丁。n = [1,2,3,10,22]t = 4def searchInsert(nums, target): n = len(nums) if target >

2016-08-09 16:07:22 221

原创 Pascal's Triangle II

leetcode第119题,这个题目是杨辉三角的升级版,要求在o(k)的空间复杂度内生成某一行的杨辉三角。杨辉三角的一般生成方法都是通过上一行来计算下一行,但是现在要求在指定行原地操作,难度增大了很多,需要找到规律。规律是,从后向前,依次加前面那一项。这里要注意一些细节,特别是下标的处理。首先外层循环是1开始移植到行号+1结束,表示本行有这么多个元素。内层循环的下标比较令人费解,代码中我做

2016-08-09 15:41:40 171

原创 Evaluate Reverse Polish Notation

leetcode第150题,逆波兰表达式,南大机试题,要是早点会这道题就好了。思路比较简单,就是用栈来模拟运算的过程,凡是遇到符号就取出栈中的两个操作数,然后执行运算,运算结果再压回栈中。pythop写的话会有一个坑,那就是负数的除法问题,有一组数据运算6/(-132)的时候系统默认结果是0,python结果是-1,需要人工做一点处理,否则这组数据死也过不去。class Solutio

2016-08-09 11:15:40 169

原创 Compare Version Numbers

leetcode第165题,这道题没有什么特殊的算法,就是考察能否对于所出现的情况考虑周全。注意一下几个点即可。1、版本的长度不一致怎么处理?2、版本中出现了0xx怎么处理?面对以上两个问题,尤其是第一个问题,我的思路是长度不一致,直接用0补全就好了,然后按照要求正常比较即可。出现0xx这样的数据也没关系,直接int强制转换就可以了。class Solution(object):

2016-08-08 17:18:44 173

原创 Climbing Stairs

leetcode第70题,简单题,如果按照题意就用递归求解没有问题,但是递归的话大数据过不了,这时候就需要找规律了,不难发现结果就是斐波那契数列,因此可以用非递归实现斐波那契,这样就可以提升速度了。递归的主要思路是,当只有一个台阶的时候,只有一种走法,两个台阶的时候有两种走法,两个台阶以上的时候,走到最后一步无非就是两种情况,一种是还剩下一个台阶,另一种还剩下两个台阶,这样就从递归式中减去1或

2016-08-08 15:17:52 201

原创 Sum Root to Leaf Numbers

leetcode第129题,树的深搜问题,要求把从根节点到叶子节点上所有的数都攒成一个整数,然后加起来。很明显是深度优先搜索,不过由于我们需要要把路径上的数攒成一个整数,因此在搜索的同时还要做这个工作,当搜索到叶子节点的时候,这个数就攒完了,加入到数组列表中即可。# Definition for a binary tree node.# class TreeNode(object):#

2016-08-08 14:48:04 182

原创 Contains Duplicate II

leetcode第219题,寻找重复元素的升级版,这次不仅要找出重复元素,而且下标距离还不能超过给定值k。基本思路同样是使用hash,为了优化,我们在遇到重复的情况的时候,不断地检查其下标距离,只要满足条件就立刻返回True,否则就更新hash表中的值。class Solution(object): def containsNearbyDuplicate(self, nums, k

2016-08-08 11:15:01 171

原创 Contains Duplicate

leetcode第217题,寻找重复元素,只要存在重复元素就返回True。这个题就很简单了,直接用hash就可以了,没什么难度。class Solution(object): def containsDuplicate(self, nums): """ :type nums: List[int] :rtype: bool

2016-08-08 11:11:47 224

原创 Number of Islands

leeicode第200题,本质上就是寻找最大连通域的块数。这个题可以用很多方法求解,标签提示可以用广搜深搜,在这里使用了并查集。这个题的并查集使用需要一定的技巧,首先并查集的基本操作基本没有什么差别,但是为了统计并查集的个数,可以事先统计一下1的个数,每次把一个新的1元素并入集合的同时就自减,这样最后剩余的就是集合个数了,无须再次遍历。另外就是并查集储存什么值的问题了,一开始我想储存

2016-08-08 11:09:20 278

原创 Merge Sorted Array

leetcode第88题,这道题是将两个有序数组合并,但是要求在原来的一个数组上进行原地操作。这个题目并不难,但是测试数据不知道怎么搞,不过程序原理明白就差不多了。典型的双指针法,两个指针分别指向两个数组最末尾的两个数,比较大小,最大的那个数就放到nums1的最末尾,然后指针前移,直到最后,看看nums2中有没有剩余的元素,把剩余的都放到前面就可以了。class Solution(ob

2016-08-07 09:47:34 145

原创 Valid Anagram

leetcode第242题,一道简单题,判断两个字符串是否是由同一套字母组成。这个题很明显用hash就可以,但是坑也是挺多的,注意一个点就可以了,那就是同一字母出现的次数也需要严格相等才可以。class Solution(object): def isAnagram(self, s, t): """ :type s: str :typ

2016-08-06 12:32:32 220

原创 Summary Ranges

leetcode第228题,要求概括出一组连续数字的范围。这个题目本身并不算是很难,但是需要一些小的技巧来处理一些比较特殊的情况。基本思路就是设置两个标志位,一个开始,一个结束,当判断数组中后一个数字是前一个数字加1,结束标志位标记位数组中的该位,否则就意味着这一段连续数字结束了,输出结果,然后更新开始标志位。注意两个小的细节:1、单个的数字怎么办?输出最后结果要判断一下开始结束标志位

2016-08-06 11:27:27 211

原创 Generate Parentheses

leetcode第22题,括号生成,给定括号的个数,输出所有合法的括号组合。这道题乍一看这的没有啥头绪,我一开始的思路是把括号编号,括号之间关系抽象成互相之间的嵌套,但是这样做一个有一个问题就是重复很多,需要最后一步去重的操作,这样并不是最好的办法。我借鉴了网上一种非常巧妙的办法。括号匹配生成的时候,面临着两种选择,一个是加入右括号,一个是加入左括号,那么什么时候加入左括号,什么时候加入右

2016-08-06 10:25:10 227

原创 Subsets

leetcode第78题,寻找给定集合的所有子集,包括空集。一开始准备使用深搜,这也做倒也没啥问题,但是去重是一个很麻烦的事情。换种思路决定用二进制来做。将给定集合的每个元素分别用一个二进制位代表,1表示该元素在子集合中,0表示不在子集中。这样所有二进制数的情况就对应了所有子集的可能情况,只要一一对应出来即可。注意python的bin函数是转换二进制数,但是前面带着一个0b字符,所以我们要对它做一...

2016-08-05 11:10:06 365

原创 Permutations

leetcode第46题,元素的全排列,这是一个很典型的回溯问题,也是深搜的问题,网上大部分的解法也差不多,我这里参照网上思路使用了两种方法。方法一:回溯全排列这个问题很明显是回溯,但是怎么找状态空间是个问题。假设1234是初始的四个数字,如何产生全排列呢?可以把第一个数字1依次与之后的数字交换,会产生一组数字分别为1234、2134、3214、4321。注意,假设1与2交换,变为2134

2016-08-05 10:14:50 272

原创 Nim Game

leetcode第292题。这个题是个脑筋急转弯,一堆石头,两个人交替拿,每个人可以拿1-3个,最后一个石头被谁拿走,谁就获胜。一看这个题我就用递归做了,但是最后超时了,不过没关系,通过递归分析我们可以清楚地看见最后的规律是怎么找出来的。递归思路,首先n为1,2,3的时候显然是可以获胜的,因为可以全部拿走,如果n为4的时候,无论我怎样拿都会输,n为5的时候可以看看拿走1-3个剩余是什么情况

2016-08-05 08:13:24 266

原创 tensorflow实现KNN识别MNIST

KNN算法算是最简单的机器学习算法之一了,这个算法最大的特点是没有训练过程,是一种懒惰学习,这种结构也可以在tensorflow实现。KNN的最核心就是距离度量方式,官方例程给出的是L1范数的例子,我这里改成了L2范数,也就是我们常说的欧几里得距离度量,另外,虽然是叫KNN,意思是选取k个最接近的元素来投票产生分类,但是这里只是用了最近的那个数据的标签作为预测值了。__author__ =

2016-08-04 11:08:08 4159

原创 tensorflow实现softma识别MNIST

识别MNIST已经成了深度学习的hello world,所以每次例程基本都会用到这个数据集,这个数据集在tensorflow内部用着很好的封装,因此可以方便地使用。这次我们用tensorflow搭建一个softmax多分类器,和之前搭建线性回归差不多,第一步是通过确定变量建立图模型,然后确定误差函数,最后调用优化器优化。误差函数与线性回归不同,这里因为是多分类问题,所以使用了交叉熵。另

2016-08-04 10:34:31 1095

原创 Word Pattern

leetcode第290题,这个题是一个匹配题,虽然分类是简答题,但是容易出现考虑情况不全的问题。下面一步步分析一下.首先按照题目要求先匹配,最简单的方法当然是用hash,这里我采用了python的字典,将patter中的字母最为键值,逐行扫描patter中的字母和字符串列表中的每个字符串,看能否在字典中匹配,只要有一个匹配不上,就立刻返回False。以上思路不难,下面就是小细节坑爹的地方

2016-08-04 09:16:55 334

原创 Rotate Image

leetcode第48题,旋转图像,给定一个二维矩阵,要把它顺时针旋转90度,要就是原地操作。这个题并不算是特别难,但是原地操作会有一些限制。原地操作意味着我们需要找出变换前后每个元素的对应关系,然后就可以直接交换元素,也就完成了原地操作变换,但是这个关系不好找,我就偷个懒,先把矩阵转置,转置的关系很明显是坐标序号颠倒,转置之后的矩阵距离目标矩阵的不同就是每一行都是反序的,这样只要再把每一行倒

2016-08-04 08:36:52 283

原创 用tensorflow构建线性回归模型

用tensorflow构建简单的线性回归模型是tensorflow的一个基础样例,但是原有的样例存在一些问题,我在实际调试的过程中做了一点自己的改进,并且有一些体会。1、tensorflow构建模型第一步是先用代码搭建图模型,此时图模型是静止的,是不产生任何运算结果的,必须使用Session来驱动。2、第二步根据问题的不同要求构建不同的误差函数,这个函数就是要求优化的函数。3、调用合适

2016-08-03 20:17:51 10772

原创 Surrounded Regions

leetcode第130题,迷宫题的近似题,深搜广搜问题,但是据说这道题用深搜会溢出,所以还是使用广搜比较好。分析问题可以看出,所有与边界搭边的O全部都要被保留,因此这道题应该反过来考虑,那就是不要考虑哪些圆圈被包围,而是哪些圆圈在边界上,然后依次为基础进行广搜,搜索出所有与边界圆圈接壤的圆圈,并把它们做一个标记,此时剩下的就是被包围的圆圈了,再做一次遍历,把包围的圆圈改成X,然后标记过的位置

2016-08-03 11:03:28 284

原创 Add Digits

leetcode第258题,这道题要求讲一个数字的各个位加起来,一直得到一个个位数为止。最简单的办法就是按照题目所给出的操作模拟,但是题目要求不要用循环和递归,而且复杂度要在o(1),这提示我们两种可能。1、这道题可以使用打表法,直接在表内搜索答案,但是这种可能不太高。2、这道题有内在规律,总结出公式就可以一步出结果。显然这道题是第二种可能。当然这道题也有具体的数学推导,附上链

2016-08-03 09:02:04 234

原创 人脸识别经典算法实现(三)——LBP算法

第三种算法称之为LBP算法,这个算法的思路与PCA和Fisher有很大不同,他是考虑局部特征算子,并不是全局考虑。这种算法定义了一种LBP特征,这种特征与我们经常见到的Haar特征、HoG特征没有啥太大不同,都是特征算子,只是算法不同。因此,我们按照理解特征算子一类的算法去理解LBP就可以了。注意,LBP对关照不敏感,为什么?因为LBP算子是一种相对性质的数量关系,相比于PCA或者Fsih

2016-08-01 18:54:57 8793 2

原创 人脸识别经典算法实现(二)——Fisher线性判别分析

第二种人脸识别的经典算法是Fsiher算法,也称之为线性判别分析,我最先看到这个算法是在周志华老师的《机器学习》中,没想到在人脸识别上也有应用。这个算法的思路和PCA差不太多,都是着眼于图像全局考虑,PCA考虑的是如何确定一组正交基可以使数据降维,线性判别分析则是考虑如何确定一组投影向量可以让数据集在投影钟尽可能大的相互区分。直观上看,区分为非就是类与类之间的差别应该更大,而类内的数据应该更加

2016-08-01 18:48:21 9210 3

原创 人脸识别经典算法实现(一)——特征脸法

近来想要做一做人脸识别相关的内容,主要是想集成一个系统,看到opencv已经集成了三种性能较好的算法,但是还是想自己动手试一下,毕竟算法都比较初级。操作环境:python2.7第三方库:opencv for python、numpy第一种比较经典的算法就是特征脸法,本质上其实就是PCA降维,这种算法的基本思路是,把二维的图像先灰度化,转化为一通道的图像,之后再把它首尾相接转化为一个列向

2016-08-01 18:38:14 39114 9

空空如也

空空如也

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

TA关注的人

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