自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

靖空间

降低成功的时间复杂度,提高生活的空间复杂度

  • 博客(98)
  • 资源 (5)
  • 收藏
  • 关注

原创 LeetCode Next Permutation 生成下一个序列

本题关键也是理解题意是什么,然后画图,总结规律。1 从尾端往前寻找前一个元素比后一个元素小的位置i。找到这个位置之后,继续从后往前找,找到第一个大于num[i]的元素,交换;2 i元素之后的元素排序,或者转置,都可以随你喜欢。 如果整个序列是倒序的,那么直接转置,或者排序都可以。不过还有更加简单的LeetCode有史以来最简单的一句话程序,看下面。程序如下:

2013-11-30 18:43:40 90

原创 C++ STL vector, valarray, 和bitSet使用方法对比

三个容器要数vector是最常用的了,但是什么时候应该使用其他容器呢?下面看看他们的用法比较。初始化: valarray并不是一个标准的stl容器,因为它本身没有iterators,这就是为什么上面它不可以想vector那样初始化。尽量不要使用vector<bool>这样的容器。下面程序最后一句是不能通过编译的。因为&arr[]返回的是使用代理类型,而不是指针地址。但是下面代码却是可行的:但是这个问题,使用bitset也是无法通过编译的:valarray是用来存储一个数列,可以快速

2013-11-30 08:53:00 4079

原创 LeetCode Swap Nodes in Pairs交换链表中的两个节点

入门题,注意:1 保存next节点2 需要使用三个节点指针3 保存好链表头指针

2013-11-30 08:38:40 5421

原创 3D游戏技术 - 大型3D地图优化渲染技术

技术简介:如果需要渲染一个大型3D地图,由于数据量,需要渲染的东西非常多,所以尤其一些慢一点的机器就会变得非常卡。如下面这些会造成帧率(FPS)下降的图:这样的图:还有这样的魔兽世界的图:到底暴雪是如何让这些场景流畅地渲染的呢?那就必须想办法提高渲染速度,也就是帧率(FPS)要提高,才能使得游戏流畅。会用到的相关技术会有:1 地图分块剔除2 kd树3 BSP树4 LOD技术等等,最后把场景优化到极致,才能创造出伟大的游戏。每一种技术都需要挺长篇幅介绍的,本文就分

2013-11-30 08:22:53 17610 26

原创 LeetCode Roman to Integer 罗马数字转阿拉伯数字

Roman to IntegerGiven a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999.知道转换规律就行。int romanToInt(string s) { if (s.length()==0) return 0;

2013-11-29 09:34:40 3166

原创 面试题: 数字转英文 数字发音

给定一个数字,转换成英文,如:123 one hundred twenty three本题的逻辑并不是很难,但是很麻烦,分情况很多, 要想很优雅地解决这个问题确实是不容易的事情。因为逐个数字地翻译,那程序就会变得非常丑陋。所以必须很好地把数字分段,然后优雅地组合在一起,考虑好扩展性。 下面设计一个类,看看如何实现,这个程序可以支持长整型,而且扩展性非常好,可以很容易地扩展。下面看看测试效果是怎么样的:

2013-11-29 08:39:05 2655

原创 LeetCode Integer to Roman数字转成罗马数字

Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999. 把数字转换成为罗马数字,一般我们都不太熟悉罗马数字,所以只能Wiki一下了:http://en.wikipedia.org/wiki/Roman_numerals 程

2013-11-28 07:56:28 2017

原创 第一人称游戏技术 - 实现在高低不平的3D地形上行走效果

在高低不平的地图上行走比在平面上行走要困难很多,因为y轴的高度要随着地形不同而变化,要想让镜头固定在地面上某一高度,模拟人在上面走的感觉就牵涉到很多技术.下面看看效果图如何:下面看看其中的关键技术是什么。1 取得高度图的高度要定义一个可以行走在高低不平的地图上的Camera,首先需要定义一个函数getHeight(x,z),取得地图的高度,一般定义为y坐标大小。设p = (px,py,pz)为当前Camera的位置。我们利用函数getHeight(x,z)计算py = getHeight

2013-11-28 07:50:19 7845 5

原创 LeetCode Divide Two Integers 不使用除号取模乘号实现两数相除

不使用乘法,除法和模操作实现除法运算。思路就是用被除数减去除数,减尽为止,如下面程序。不过很可惜,上面的程序是无法通过的,因为需要优化一下。上面的程序是基本思想,所以,先要知道这个程序。下面是两个优化的程序,都可以AC。

2013-11-27 17:13:13 9194

原创 LeetCode Remove Nth Node From End of List 删除倒数第n个元素

这里的Note的意思应该就是可以不做特殊处理n值了。不过其实特殊处理也就一句语句。思路:快指针和慢指针的概念,先一个指针先走,到了离起点n个节点远的时候,慢指针走,等到快指针走到结尾,那么慢指针走到了需要删除的位置了。初学者注意:保留慢指针的前置指针,这样才能删除。注意:特殊处理需要删除头指针的情况,如输入1->2->3->4; n=4,那么需要删除1,这就需要特殊处理了,头指针往前一步就可以了。

2013-11-27 09:58:30 5621

原创 LeetCode Valid Parentheses判断括号是否配对

对栈熟悉的,一开始就会想到栈的应用了。严慧敏那本书也介绍了差不多的栈应用。思路应该很好想:1 利用一个栈保存string s里面的字符2 判断如果左括号(,{,[入栈,如果右括号]}),与栈顶成对就进栈,不成对就入栈,如果此时栈为空,可以提前判断返回false3 最后判断栈是否为空,空返回真,非空返回假。我这里增加一个额外函数把这些括号转换为整数,以方便判断第二种情况,使得程序更加简洁。

2013-11-27 08:00:01 1729

原创 LeetCode Remove Element 快速删除数组中的某一值

为初级入门题了。两种思路:1 如果找到特定值那么用最后一个元素值覆盖之,最后元素往前进一个元素2 一个快指针,一个慢指针,不等于特定值的时候,把快指针指向值覆盖慢指针值。这里是用下标表示指针概念了。我本来以为第一个思路会快点的,不过测试的编译时间差不多,应该速度差别都可以忽略不计。思路1程序:

2013-11-26 16:47:46 1295

原创 LeetCode 4Sum

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.Note:Element

2013-11-26 09:56:57 1467

原创 LeetCode Generate Parentheses 深度分析理解

以我的思维,我是使用二叉树的思维思考这个算法的我考虑这个递归树的时候有两个难点:1 如何两边同时遍历一棵树?2 如何剔除不适合的路径?比如最中间的路径是不满足条件的。到底是什么样的树?构造出这样的概念树,我觉得就好理解很多了。看看下面我画的树:顺着路径对称地,比如最左边和最右边,遍历两个路径,就是一个解,除了最中间的不符合要求。所以要遍历这样的概念树,很困难。这个功能是已经遍历了左边的树,然后这里并不需要遍历右边的树,而是非常巧妙地直接补上右括号“)”就完事了。没做过的话,真是想破头

2013-11-26 08:05:53 4610

原创 面试题:找出数列中间未排序好的子数列

书中给出的思路:1 先左边往右搜索,找到第一个递减的下标,然后右边王左搜索,找到第一个递增的下标2 两个下标把数列分为三部分,然后找到中间子数列最小和最大值3 然后找到左边数列第一个小于最小值的下标,找到右边第一个大于最大值的下标。我思考了很久,终于下结论,这个思路是错误的,这么经典的书,怎么会犯那样的错误呢? 到了官网查找errata,并未提及,报告之,等等有什么反应。这个思路如果查找数列如{2,7,9,5,5,3,8,10};那答案是1和5,明显是错误的。我的解题思路是:1

2013-11-25 15:45:47 1393

原创 LeetCode 3Sum Closest 最接近目标数的三个数和

这道题和3Sum差不多,不过也有不一样的,主要是:1 这里不用判断处理重复问题2 要比较其中的三个数的和与目标数的差的大小。

2013-11-25 09:13:02 3290

原创 判断平面和AABB包围体是否发生碰撞

AABB通常是由最小值和最大值组成的,这里就用const Vector3 &bbMin和const Vector3 &bbMax表示一个AABB包围体。这里通过判断平面的法向量的方向,确定离平面最近的点为最小点min,离平面最远的为max。通过判断三个情况:1 最小点min在平面正面,那么肯定为不相交了。2 最小点min在平面负面,最大点max在正面,那么就相交了。3 如果最大点在平面负面,那么就不相交。同时也带了Shpere(圆形)包围体和平面相交的函数,那更容易。

2013-11-25 07:36:31 3151 4

原创 LeetCode 3Sum 三个数和为零的集合 C++完整程序

掌握了这样的题的要诀就好办:1 排序2 前面的两个小数和后面的一个大数相加比较,如果小于0,那么前面的数往前进,增大; 如果大于0,那么后面的数往前进,减小。3 前面的数和后面的数相遇,本次循环结束。如本程序,第一个i可以看做是定标,j是前面的数,k是后面的数。还有注意的就是:记得越过重复的数,以避免答案重复。当然也可以使用额外的数据结果,如set来作为容器,不允许重复数据的,或者最后使用unique处理掉重复元素。下面带测试完整程序,方便一下初学者

2013-11-24 19:11:51 5789 5

原创 LeetCode Longest Common Prefix 最长前缀

Longest Common PrefixWrite a function to find the longest common prefix string amongst an array of strings.这是一次性通过的简单问题了。要点:1 用第一个string初始化,并初始化当前maxPre为该串长度2 从第二个string开始比较,并记录当前maxPre的最大长度

2013-11-24 15:56:15 2172

原创 LeetCode Container With Most Water 查找容水量最大的容器 动态规划法思想分析

其实这个是动态规划法做的,因为我没看到有人分析其中的动态规划法思想,所以在这里分析一下。下面分析是怎么样的动态规划法思想。1 分区,首先分最大区间,左边高度为height[0],右边高度为height[n-1], 分一个区间,那么这个区间的解肯定是height[0]和height[n-1]围成的区间2 区间细分,分两个区间height[0]和height[n-2],还有height[1]和height[n]也构成一个区间,这个区间的最大木桶容水量和前面比较,这个值也可以用表保存下来,但是因为我们

2013-11-24 14:33:27 2948

原创 面试题 猜颜色球游戏

游戏规则:有四个插口, 可以放有四个球,颜色分别为红色(R),黄色(Y),绿色(G), 和蓝色(B),放的颜色顺序位置都可以是随机的,如:RYGB,YGRB等都是合法放置。注意:插口有RGBY,猜GGRR只能是一个hit和一个pseudo hit。原书的程序应该是有点错误的,按他的程序这个解答就是1个hit和3个pseudo hit了。先吃透他的规则,注意特殊情况,然后就好做了。书中提到的注意地方:1 代码清晰,比如定义一个结构体返回结果2 定义额外函数

2013-11-24 10:40:09 5843

原创 C++求点和平面的关系

一个平面通常是由一个平面法线向量,如v1(1,2,3),和点到原点(0,0,0)到平面的距离确定的。当然数学中还有其他定义方法,但是DirectX和OpenGL都是使用这种定义方法的。这样定义的平面叫一般平面,其实是由点法式平面变形来的。点我们可以使用Vector3类来确定,这个类既可以确定点,也可以确定向量。下面定义一个平面:CreatePlane函数是用三个点确定一个平面,并计算成一般平面,存储好。 classfyPoint这个函数就是用来计算点和平面的关系的。实现代码:

2013-11-24 08:56:58 4256

原创 LeetCode Regular Expression Matching 极品代码赏析

这个条件很容易忽略,也是最重要的条件了,因为这个相当于*可以把它的前缀字母”吃掉“所以也是为什么我们需要“往前看”,看到pattern字符串后一位,假设这个字符串为const char *p; 那么我们就要先考虑到前一个指针,然后再比较当前指针。下面代码来自:但是文中只是分析了原理,并没有分析代码是如何写的,所以,我这里就分析一下他的代码。因为程序非常短,所以每一句都有非常重要的意义,看仔细了,漏掉任何一个细节都理解不了这个程序。

2013-11-23 20:51:26 2569

原创 C++实现一个Vector3空间向量类

Vector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:1 + - * /算术运算2 向量的数量积,又叫:点乘3 向量的向量积,又叫:叉乘4 向量单位化(normalization) //Vecotr3.h#pragma oncee

2013-11-23 15:05:57 8983 3

原创 LeetCode String to Integer (atoi) 字符串转换整数

好长的注意地方,因为要考虑的东西实在也挺多的。总结如下:1 前面空格分隔符号的时候2 第一个符号位处理+ -3 遇到非数字字符退出4 为正数的时候,大于INT_MAX上溢5 为负数的时候, 小于INT_MIN下溢6 为空字符串或者空指针的时候

2013-11-23 12:21:05 2343

翻译 双语:Threads 操作系统线程

A thread is a basic unit of CPU utilization; it comprises a thread ID, a program counter, a register set, and a stack.一个线程是一个使用CPU的基本单元; 它由进程ID,程序计数器,寄存器和栈组成。It shares with other threads belongi

2013-11-23 10:55:08 1781 2

原创 LeetCode Longest Palindromic Substring 最长回文子字符串 两种方法分析解答

最难想的地方:P代表一个表,比较难想的就是P表的下标i和j代表原字符串中的两个前后下标s[i]和s[j]的位置。如果P[i,j]为真,当且仅当si-1,si-2...sj-1,sj这一个子串都为palindrome。例如:s[] = skrdjdre那么P[2][6] = true,因为s[2]=r=s[6],且djd为回文。不明白,可以看下表,动手填一填,未填出的都初始化为false,其中t代表填写true:实际leetcode运行速度:但是其实有更加简单的方法,实际运行速度更加快。思想:1

2013-11-23 10:27:57 3456

原创 如何不使用比较和判断查找最大值

给定a和b两个整数如何不使用比较和判断操作来实现输出其最大值?这里可以学习几个有趣的函数:1 获取一个数的正或负符号2 反转一个符号这里是通过符号的判断来巧妙地实现的。基本思路:符号位正,用1表示,符号是负用0表示。有四种情况:1 a b同号, a正,b负,那么最大值肯定是a,只要a乘以自己的符号1,b乘以自己的符号0,得出的就是最大值2 a b同号, 也一样道

2013-11-22 17:12:30 1491

原创 在O(n)时间复杂度内查找前三名算法

查找前三个最大或者前三个最小的数,相当于查找冠亚季前三名的算法了,应该如何做呢?当然可以用堆做,时间效率很高,下面是个简易的方法。查找前三个最大数算法:1) 初始化三个数为INT_MIN2) 循环 a) 如果当前元素大于第一名,更新第一名,且第三名=第二名; 第二名=第一名; b) 如果当前元素大于第二名,而且不等于第一名,那么更新第二名,而第三名=第二名;

2013-11-22 10:01:21 1924

原创 最少钱币数 - 动态规划法求解 - 可输出最终找零方案

假设cNums[i]是记录了需要的最少硬币数来找零i元的。那么如果我们使用面值是x的硬币来找零,那么现在我们就需要 cNums[i] = 1+cNums[i-x]; 记得i是总钱币数,需要减少x,然后找到了i-x下标,对应之前已经找到的最少钱币数的存储数组的值。如下面的图:例子解说:这里的初始化值是0,因为要找零0元,只需要0个硬币。我们有2元7元和3元的硬币值。当i=2的时候,那么就需要1个2元的硬币,到了3的时候就需要一个3元硬币,到了4需要2个2元硬币。以此类推,到了10可以用5个2

2013-11-21 19:03:32 12679

原创 LeetCode ZigZag Conversion 打印之字形字符图案 带打印程序

按照它题目给出来的例子,不熟悉的话,还真不知道他想我们干嘛,所以还是看看图样就清楚了,如下面的运行打印图:8行的时候5行的时候这就清楚了,利用输入字符打印一个倒立之字形的图样。 关键是要会如何计算各个字符的位置,这就需要数学知识了,根据特殊推导出公式来。主要是3个公式:1 之字形行数为nRows,那么每次重复样出现前的间隔字符为zigSpan = nRows*2-2;2 第一行和最尾一行都是存放一个字符的,所以存储的字符为间隔为zigSpan的字符3 中间行是需要额外存储多一个字

2013-11-21 12:18:52 2575

原创 如何计算阶乘运算结果尾部有多少个零

Write an algorithm which computes the number of trailing zeros in n factorial.阶乘n! = n*(n-1)*...*1要计算出这样的运算结果有多少个零,如果直接运算就很可能是溢出,那么只能用其他方法了。因为尾零得来是由于2*5等于10,那么就会为结果增加一个零,所以只要计算这两个数出现了多少对就可以了。但是由于2出现的次数会远远大于5,所以,只要计算5的倍数出现多少次。程序本身很好理解,就是如何想出来的确是个麻烦

2013-11-20 19:12:35 3300

原创 LeetCode Add Two Numbers两个链表数值相加

Add Two NumbersYou are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. 相当于无限加了,就是用了链表来存储数据。本题就是考对链表的操作和模拟加法。第一种方法:这个跟合并两个有序链表成一个有序链表的程序结构是一样的。

2013-11-20 14:01:47 2122

原创 LeetCode Longest Substring Without Repeating Characters 最长不重复子串查找

这道题目也是下标难以处理,关键点:1 利用maxlength变量记录当前已经查找到的最长不重复子串2 巧妙的移动两个下标,如下图示:

2013-11-20 10:16:43 2522

原创 如何不使用任何额外空间实现两数相互交换

但是如何实现这个函数,不使用t呢?有两种方法,第一种方法,利用减法实现:这很好理解,难理解的是第二种方法,利用异或运算^位操作实现:理解起来还是有点难度。那是利用了异或运算的特征,就是:任何数与1异或都相当于取反操作,例如1^1=0; 0^1=1任何数与0异或都相当于保留操作:1^0 = 1; 0^0 = 0;理解方法:由特殊推导一般,就是假设两个数都是一位二进制数,那么就算他们是多位二进制数的情况也是一样的。假如b为1,就是对a做取反操作a = a^b;就是对a取反了

2013-11-19 20:19:22 2810

原创 LeetCode Median of Two Sorted Arrays两数列的中间数

感觉本题并不难,如果用简单的方法做的话,好像很容易就通过了。比如合并成一个数组,然后排序,然后直接返回中间数,也可以通过的,如下程序:这就没有利用的原理两个数列是已经排序好的特点了,所以需要优化一下。就是利用截断法原理,每次递归截断一定元素。本题目就是选取两个数列的中间k/2个元素,要很小心选取这个元素,要诀就是:不要截去的太快了,不然结果就会不正确的。如果截去太快了,就要-1,截去慢一点。看看下面的程序就知道了。不同的是这里要利用好原数列特点。也可以像这样处理下标:所以要理解这里的

2013-11-19 14:52:06 1894

原创 C++适配器功能实现及函数对象

很多STL算法都使用了function objects也叫functors,是一个对象,重载了()操作符,也就能像调用函数那样了使用这个对象了。比如简单的sort算法:那就可以排序vec,但是如果vec装的不是int而是自定义类型呢。如LeetCode上最喜欢用的链表数据结构:struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};如果我们需要比较ListNode的

2013-11-19 11:07:46 1853

原创 LeetCode Add Binary 高精度二进制加法

就是简化版的高精度加法,但是,其实也不是简化了。因为有一个特殊情况:如果进位是1,那么剩下一个数的时候后面的为都是1,那么1+1要进位,就要一直进位进到最高位+1了。如11110101,到第五位要进位的话,就会一直进位超过最高位了,而这个在10进制中是没有的情况。

2013-11-18 18:30:12 1910

原创 Boyer Moore 简易版算法

Boyer Moore子字符串搜索算法是非常难的算法,但是它的简易版本却是不难的,而且搜索速度很快,下面就学习一下简易版吧。 Boyer Moore是从子串的右到左搜索的,当然搜索主串文本的顺序还是从左到右的。虽然是简化版,但是速度也不比KMP差。如下图:如图比较到N的时候与E不匹配,那么我们就在子串里面NEEDLE看看有没有N这个字母,刚好是有的,所有就移到子串N的位置进行比较,那么一下子就跃进了很多了; 在看到了S的位置,不匹配,看看子串里面有没有S这个字母,没有,所以我们整个子串都右移

2013-11-18 16:31:50 1530

原创 LeetCode Multiply Strings 高精度乘法C++实现

这道题就是模拟乘法思维了,还需要模拟加法思维,每一位乘以一个数都要和前面的结果加起来。注意:1 要把这两个操作过程分清楚,不能混饶了,否则会结果不正确的。2 乘法有进位,和前面的结果加起来也有加法进位,一定要分清楚。3 每一次一个新数位与被乘数相乘之前,都一定要把两个进位加在结果上。4 同时需要把两个进位值都清零。我基本上都是栽在这几个点上了,不然不用花那么长时间,思考问题的思路还是不够清晰,仍然需要继续提高啊!

2013-11-17 15:00:11 4465

OpenGL完美的心形

可以参考本人博客: http://blog.csdn.net/kenden23/article/details/27338943 是一个使用OpenGL FreeGlut画的一个完美的心形。

2014-05-28

简单Windows弹球程序

详细描述,请看下面博客: http://blog.csdn.net/kenden23/article/details/17268877

2013-12-14

第一人称3D镜头框架代码

http://blog.csdn.net/kenden23/article/details/14051187 这个博客讲解的代码框架。讲解的类部分另外下载,可在博客上找。

2013-11-02

第一人称3D镜头类

http://blog.csdn.net/kenden23/article/details/14051187 这个博客讲解的代码,可以实现一个3d漫游第一人称视觉的类。一个镜头类,可以控制3D视觉,实现漫游效果

2013-11-02

算法问题集合源文件 堆排序 吊桶排序 最大子段和等

这个是本博客算法专栏的部分.cpp源文件,方便大家打包下载,如果没有积分的话,可以到我博客粘贴,博客有完整的代码。 http://blog.csdn.net/column/details/billsalgorithm.html?page=1#12944927 这里是部分源文件,暂时没时间全部做好。 可以直接加入项目运行的,建议使用vs2012编译。

2013-10-22

空空如也

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

TA关注的人

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