自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 NP-完全问题

8.3 先假设SAT的一个实例I,若I中变量的总数为k,则(I, K)是吝啬SAT问题的一个实例。给定(I, K)的一个解S,若S中为true的变量有至多k个,则S也是I的解。因此,吝啬SAT的解也是SAT的解。从而,SAT问题归约为吝啬SAT问题。 综上可得,吝啬SAT问题是一个NP完全问题。

2017-07-12 22:38:52 204

原创 554. Brick Wall

解决问题最重要的思路就是将图形问题转换为数字问题,我们需要搞清楚最重要的一点,那就是:一条竖直的线如果没有经过第n层的砖,则说明第n层的砖的长度刚好是线到左侧的距离。 那我们的做法就是,先创建一个vector,先把每一层的第一段空隙到左侧的距离(首个砖的长度)加入到vector中,再把下一段空隙的距离加入vector中,以此类推,知道把最后一段空隙的距离加入到vector中(不包括最右侧那段)。

2017-06-17 01:23:32 198

原创 330. Patching Array

挺难的一道题,很难想得到其中的算法,重点是要观察数字之间的规律。 首先我们要知道,如果我们只用nums数组的前几位来进行组合能得到的最大数是n,那么我们加入数组的下一位数字k后,我们能得到的数就是原先能得到的数和原先能得到的数加k。这是解决这道题目最核心的一点。 我的算法是,先定义一个max,即我们能组合成的一个最大数,一开始设为0。我们从nums数组的第一个数字开始,如果这个数字小于等于ma

2017-06-11 17:29:04 177

原创 135. Candy

又是一道无法理解为何等级为hard的题目。 题意非常简单,等级高的小孩子得到的糖果也更多,因此解决思路也十分简单:从头到尾遍历一遍,后一个小孩比前一个小孩等级大时,后一个小孩拿到的糖等于前一个小孩拿到的糖数量加一,但这样就没有考虑到后一个数比前一个数小的情况,于是再加一个从尾到头的遍历过程。 代码如下:

2017-06-03 17:10:05 202

原创 343. Integer Break

又一次的疑惑,为什么动态规划的题目总是数学题,这似乎不关乎算法,而关乎数学推理能力。 首先,我们假设所给的数字n已经被拆分为若干个数字,而决定是否要对已经分好了的数字进行再拆分的条件,就是看这个数字拆分后的乘积是否会大于原数字。 而由一元二次方程可得,但这个数字大于等于5时可以拆分它,拆分后数字乘积会大于原数字。这样就决定了只能将原数字拆分为1,2,3的组合,然而优先拆出3,因为2*2*2的结

2017-05-30 22:19:25 149

原创 402. Remove K Digits

题目难度不大,关键在于细心,有许多容易忽略的点。我也是在多次报错之后在逐渐改正为最后版本代码的。 解题思路很简单,题目要求在去除k个字符后得到最小的那个数字,那我们就先取前k+1个数,比较得到其中最小的一个数,将它前面的数都删去,这样就保证了最前面的这个数尽可能小,然后从得到的那个最小的数字的下一位开始,继续取k+1个数(这时的k已经变成了原来的k减去上次删去的数字个数)继续操作,直到k等于0。

2017-05-22 10:49:25 210

原创 486. Predict the Winner

这是很难的一道题目,起初想过很多种与动态规划无关的解决方法,比如每次只考虑前面两个数和后面两个数,以此来进行决策,后来发现这种方法在四个数相差很大的一些情况会出现错误,最后只能又回到动态规划的方法来。当然,我个人并想不出动态规划的具体方法,只好参考了网上的一些做法。 我们将从第i个数到第j个数之间player1能得到的最多的分数记为sco[ i ][ j ],则sco[ i ][ j ]等于su

2017-05-16 22:49:13 319

原创 523. Continuous Subarray Sum

这坑爹题目,其实本来不应该把这题放上来,但也算花了我一段时间,那就放上来警示一下大家吧。 这决定是我做过最简单的中等难度题,比简单难度的题目还简单。一开始想着怎么找到巧妙解决的途径,想了一个早上没什么思路以后,决定试试暴力破解——双重循环,结果,居然给通过了。这告诉我们,不一定每道题都要想到巧妙的解法,有时候暴力破解,也很好。。。 代码如下:

2017-05-07 18:25:23 169

原创 552. Student Attendance Record II

这是一道典型的动态规划的题目,解题关键在于将原题目分解成适当的子题目。 我们将所有rewardable的考勤记录分成以P,A,L结尾的三种,分别用数组P[ ], L[ ], A[ ]三个数组来表示,P[n]指长度为n,以P结尾的rewardable的考勤记录,以此类推。 则所有长度为n的rewardable的考勤记录个数S = P[n] + L[n] + A[n]。 任何rewardable

2017-04-30 20:45:52 456

原创 376. Wiggle Subsequence

又是一道奇怪的题目,我原本的思路是,先求数组中每两个相邻的数之差,得到一个数组。如果这个数组连续出现n次的负值(或正值),则将count加n-1(代表要减去的元素数)。如果这个数组出现了0,则也将将count加1。最后将原数组的size减去count,则得到结果。代码如下: 然而毫无征兆地出现了错误答案,由于错误实例是一个极大的数组,所以根据错误实例我无法得出我代码错误的原因,至今不知为何,

2017-04-22 20:59:26 140

原创 22. Generate Parentheses

初看题目,这是一道挺难的思考题,因为确实没有什么可行的思路。不过可以很清楚的意识到这是一道递归题目,正常来讲,得到所有可能性的题目一般都是用循环或递归来做。 因此思路就是,构建match函数,递归调用。函数中引入参数sign作为添加左括号或是右括号的标志,参数size即n,决定了进行多少次递归,共有多少对括号。 最后,代码如下:

2017-04-17 14:31:34 187

原创 200. Number of Islands

这道题的解题思路其实不难,关键在于许多细节上。 解题的主要思路就是,每检测到一个坐标是1,就将他赋值为0并且把他上下左右四个坐标检测一遍,如果是1,就继续赋值为0并检测他的上下左右四个坐标,以此类推。这样就记录到一个岛,并且将整个岛都消去,避免重复计数。, 但我起先一直出现运行错误,多次检查,百思不得其解。后来终于发现,当行或列刚好为1时,会出现将i或j减一的情况,这样会得到一个无法运行的负值

2017-04-09 21:00:37 113

原创 502. IPO

这是一道按常规方法做就会超时的题目,所以我一开始就舍弃了多层循环的方法。 我选择对Profits进行排序,这样就可以从最大的利润开始访问,以求最大化。但是这样就会出现Profits和Capital的顺序无法对应,于是我就采用排序前将Profits的序号(也就是Capital的序号)加到Profits的50000倍里的方法,这样Profits的元素值对50000求余之后的结果就是它排序前的序号(也

2017-04-04 22:56:13 317

原创 42. Trapping Rain Water

这道题算是真的很难的一道题目,但是不明白为什么会被归在stack的分类下,我觉得应该归在math的分类下。 这道题的难点在于不能确定哪里开始装水,装水的高度多少。而这一切,并不能全部依靠代码解决,仍然需要我们对装水规律进行归纳,从而得出方法。 我们发现的第一条规律是,水从最左边(右边)开始第一个出现下降趋势的柱子才可能开始储水,比如给定数组是{1,2,3,3,2,1,2,3,1,4,5

2017-03-27 15:34:29 189

原创 11. Container With Most Water

这道题第一感觉就是用两层循环计算每个容器的容积,然后比较得出最大容积。然而,不出所料,超出时间限制,两层循环太臃肿太费时间了。 这题的难点在于容器在底变大的过程中,高的变化无法预料,所以就需要将每一个容器的容积都计算出来进行比较。 最后想到利用夹减法,先计算出底最大时容器的容积,然后每次将底减一,而高则尽量往增大的方向进行,这样就可以保证取到最大的容器容积。

2017-03-20 15:37:43 133

原创 397. Integer Replacement

这是一道看上去简单,但思考一下会发现没什么思路,解决以后觉得很简单的一道题。代码很简单,使得我有些怀疑它中等的难度。但不得不承认这其实是一道数学题。 这题的难点在于,当得到的数是奇数时,是加一还是减一。 这道题要求的是得到最少的步骤数,所以加一还是减一就必须使得接下来的步骤减少。对于奇数,加一或减一都能使其变成偶数,但是,如果能使加一或减一后再除以2得到的数仍然是偶数,则又可以减少一个步骤。所

2017-03-13 15:14:58 175

原创 315. Count of Smaller Numbers After Self

遇到这种类型的题目,一般我们第一个想到的就是暴力破解法。于是在我迅速敲出几行代码后,不出所料地提交失败,原因是超出限制时间。的确,用暴力破解法两个循环导致算法的复杂度达到O(n^2),很容易就超出了限制时间。 那我们就需要用一种方法,来记录每个元素,使得不用重复比较从而降低复杂度。 这个方法就是从后面的元素开始,将比较的数一个个加入一个vector,并按从小到大的顺序加入相应的位置,它的位置就

2017-03-05 20:05:09 225

原创 132 Pattern

这道题需要用到两层循环,第一层循环是选择一个数字来作为【132】中的1,即在前几个数字中找发生增加趋势的数的前一个数,即如果前几个数字都是减小的趋势,则选择出现一个增大的数的前一个数作为【132】中的1 。(并暂时将增大的这个数设定为【132】中的3。) 接着在接下来的数中,如果继续增大,则将增大的数设定为新的【132】中的3 。如果出现减小,则与【132】的1进行比较,若比它大,则返回Tr

2017-02-27 14:41:41 185

空空如也

空空如也

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

TA关注的人

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