自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 证明碰撞集问题为NP完全问题。

碰撞集问题中,给定一组集合{S1, S2, ..., Sn} 和预算b, 我们希望求出一个所有Si 相交且规模不超过b的集合H,当然,前提是这样的集合确实存在。证明该问题为NP完全问题。         同样的,我们使用归约的方法来证明,而我使用独立集问题来归约。独立集问题为:给定一个无向图,求一个大小不超过b 的点集,使得图中每一条边都至少有一个顶点属于该点集,当然,前提是这样的集合确实存在

2016-12-24 16:39:01 1211

原创 LeetCode 337. House Robber III

大概题意:给定一棵二叉树,每个节点都有一个值,要求从其中选取若干个节点,是的值的和最大,约束条件为任意两个选取的节点之间不能相连。          解题的思路也很清晰,我们可以用动态规划的做法,以递归的方法实现。对于任意一个父节点,我们有取与不取两种选择:如果取,则其两个子节点都不能取;如果不取,则其两个子节点即可取也可以不取。          一开始我实现了一个函数来辅助实现。函数为

2016-12-22 18:49:12 487

原创 证明吝啬SAT问题为NP完全问题。

吝啬SAT问题是这样描述的:给定一组子句(每个子句都是其中文字的析取)和整数k,求一个最多有k个变量为true的满足赋值——如果该赋值存在。而我们的目的就是证明吝啬SAT问题为NP完全问题。       这是书《算法概论》的习题8.3。我证明的方法是用归约的方法:由已知的NP完全问题归约到该问题,并证明归约的过程的时间复杂度为多项式时间复杂度即可。        我选取的已知的NP完全问题

2016-12-18 20:43:51 1753

原创 LeetCode 42. Trapping Rain Water

大概题意:给定一个包含非负整数的数组,代表一条路上的每个位置的海拔高度,求在下雨后能够储存的最大的水量。一个样例如图所示:                     我的具体做法是使用两个数组f 和 g。其中f[i] 表示位置i不会从左边漏出的最高水位,g[i]表示位置i不会从右边漏出的最高水位,则g[i] 和 f[i] 之间的最小值,就是位置i 的最高水位,用最高水位减去该位置的海拔高度,

2016-12-17 20:57:05 330

原创 LeetCode 199. Binary Tree Right Side View

题目:给定一棵二叉树,每个节点的信息包括左右节点的指针,以及其本身的值。让你给出二叉树的“右视图”, 即从上至下给出每一层最右边的节点。          这题可以用宽度优先搜索的方法来做,具体实现用队列,因为每一层右边的节点有这样的性质:如果对于每个节点,都是左子节点较右子节点先入队,那每一层最右边的节点总是该层最后一个出队的。具体维护用一个向量来实现即可。          然而这道题

2016-12-17 20:17:44 400

原创 LeetCode 330. Patching Array

大概题意:给定一个已经排好序的数组,还有一个数n,问你还需要往数组中添加多少个数,才能对于1 到 n 的每一个数a,都存在数组中的若干个数,使得它们的和等于a 。         这道题我并没有单独完成,我思考了很久,花了挺长的时间进行尝试,依然没有通过这道题。         一开始困扰我的问题是,怎么判断当前数组里的数是否已经满足了所要的条件呢?假如这里面有m个数,如果我用穷举法来检验

2016-11-26 00:52:27 306

原创 LeetCode 135. Candy

大概题意:给一堆孩子发糖,孩子们站成一排,每个孩子有一个数值。有这样的规则:每个孩子至少得到一颗糖,而数值大于他某个邻居的孩子,所得到的糖必须比该该邻居多。问你总共最少需要发多少糖。         虽然这是一道HARD难度的题,但我们并不难找出贪心策略的:我们可以将序列看成若干个连续下降子序列的组合。对于每个连续下降组序列,我们将最小的数赋值为1,倒数第二小的数赋值为2,...,以此类推。这

2016-11-26 00:15:02 241

原创 LeetCode 134. Gas Station

大概题意:有n个车站,给定两个数组gas 和 cost。对于任意车站i,gas[i]表示在车站i能够加的油的升数,cost[i]表示从车站i开向车站i + 1(车站n-1则是开向车站0)所要耗费的油的升数。问能否从某个车站出发,成功的绕所有车站一次,并回到原来的车站(需要按照车站号递增的顺序,车站n-1的下一个车站为0)。车初始是没有油的。若能,则返回起始车站号,否则返回-1。       

2016-11-23 22:55:47 328

原创 LeetCode 376. Wiggle Subsequence

大概题意:给定一个序列,求出最长摆动子序列的长度。所谓摆动序列:即为两个相邻元素的差的正负性为正负交替出现的序列。如[1, 7, 4, 9, 2, 5]就是摆动序列,而[1, 4, 7, 2, 5] 则不是。          题目要求我们找出原序列最长的摆动子序列的长度。显然,把原序列的两端的值和极大值极小值拿出来就是最长的摆动子序列了。当然,如果是那种全部元素都一样的序列,则最长子序列长度

2016-11-23 22:34:59 260

原创 LeetCode 45. Jump Game II

大概题意和LeetCode 55. Jump Game 相似,但现在已经告诉我们终点是可到达,而要求的是到达终点的最短步数。          已经告诉有解的话就省了一些麻烦,但即便不确定是否能够到达,我们也可以先运行一遍LeetCode 55 的代码跑一遍进行判断。          和LeetCode 55 一样,我先用了dp的方法做了一下,时间复杂度为O(n2),递归关系也很简单,代

2016-11-23 22:10:05 245

原创 LeetCode 55. Jump Game

本题的大概题意:给定一个整型数组nums,数组的每个值代表能从该位置向前走的最大的步数。一开始时玩家处于数组的第一个位置,问玩家能否到达最后一个位置。          这道题我使用了两种方法,第一种方法是直接使用dp进行搜索:用一个数组vis来表示某个位置是否可达, 若可达则对应值为1,不可达则为0。我们很容易就能发现一个规律:若i 是可达的,那i+1 ~ i + nums[i] 也是可达的

2016-11-23 21:43:36 383

原创 Leetcode 413. Arithmetic Slices

大概题意:规定一个数组是算术的,当且仅当满足以下两个条件:元素个数大于等于3,且任意两个相邻元素之间的差(后一个减前一个)相等。给定一个数组,求连续的且满足算术的子数组的个数。            这道题如果采取枚举起点和终点,然后再判断正确性的做法,枚举的时间复杂度为O(n2),判断最坏的情况下是O(n),则时间复杂度为O(n3),太大了,显然会超时。需要采取其它的更高效的做法。   

2016-11-16 10:31:13 230

原创 Leetcode 392. Is Subsequence

一开始没看清楚题目,以为是KMP字符串的模式匹配,还特地翻数据结构的书来复习一下。确实KMP有点难理解。              不过看清楚之后发现这不是连续子串,只要满足子串的条件就可以了,并不需要连续。所以实现代码也很简单,具体如下:class Solution {public: bool isSubsequence(string s, string t) {

2016-11-16 10:22:33 265 1

原创 Leetcode 377. Combination Sum IV

大概题意为:给定一个正整数集合S,与一个正整数target。求从集合S中取出若干个数,可重复使用,使得它们的和为target的种类数。注意,不同的排序也是不同的种类。                观察一下测试样例,这样更显的直观:                  其中(1, 1, 2),(1, 2, 1) 和(2, 1, 1) 是不同的方案。               

2016-11-16 10:01:36 335

原创 Leetcode 96. Unique Binary Search Trees

题意大概为,给定节点数,求二叉搜索树的个数。          可以这样考虑,对于每个节点,可能有四种连向它的边,分别为:左上,右上,左下,右下。除了左上和右上的边,其他的边都不互斥。           开始考虑如何构建二叉树。先考虑数字1,因为1是最小的数字,所以它左上和左下不可能有边连向它,所有>=2的节点都在1的右上或右下的子树中。           另一方面,如果确定了右上

2016-11-16 09:31:01 246

原创 LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

又是一道买卖股票的题目,题意和之前的差不多。不过又有了新的条件:不限制买卖的次数,但刚卖出股票的第二天不能买入股票。          这道题用动态规划很快就能解决,令d[j] 为区间[0, j] 的最大利润递推公式如下:          当j = 0 时, d[j] = 0 ;          当1           公式的正确性不好说明,但仔细思考后发现这样的递推公式确实

2016-10-25 17:53:52 293

原创 LeetCode 188. Best Time to Buy and Sell Stock IV

是LeetCode 123的升级版,题意也差不多,只是限制了不能超过k次买卖。话说我做到第四题才发现Stock是股票的意思,stone才是石头...              这道题做的挺坎坷了,用了好几种方法,做了一个晚上,最后还是看了题解稍微被提示一下才过的。             一开始我就想到了动态规划的方法,我用d[p][i][j]  来表示区间[i, j] 间至多买卖p次的最

2016-10-25 15:14:13 316

原创 LeetCode 123. Best Time to Buy and Sell Stock III

这道题是LeetCode 121 和 122 的升级版,题意也差不多,也是给出一个数组,每个元素代表每天买入卖出石头的价格,不能在同一天买入与卖出,要先卖出已有的石头才能重新买入,求最大利润。这次限制买入卖出的次数为2。          这道题比较简单的方法是枚举每个i,即0           但这样会超时。于是还有另外一种动态规划的做法,我们可用g[i] 表示 区间[ 0, i] 买

2016-10-25 14:39:50 223

原创 LeetCode 122. Best Time to Buy and Sell Stock II

      大概题意:给定一个数组,数组的元素i表示第i天石头买入或者卖出的价格,求出能够赚到最多的钱的数目。注意不能在同一天买入和卖出。不限制买入卖出的次数。注意只有卖掉原来买入的石头之后才能再次买入,      这道题和LeetCode 121相似,但是不再限制买卖次数了。      这道题可以用贪心的做法来解答。找到每一段最长连续上升序列,在序列的第一天买入,在序列的最后一天

2016-10-11 15:26:08 490

原创 LeetCode 121. Best Time to Buy and Sell Stock

大概题意:给定一个数组,数组的元素i表示第i天石头买入或者卖出的价格,求出能够赚到最多的钱的数目。注意不能在同一天买入和卖出。只能买入卖出各一次。             这题可以枚举买入卖出的天数来计算最大值,这样的复杂度太高,达到O(n2)。而枚举买入的天数是不必要的,假设我们要在第i天卖出,我们只要知道第i天前买入石头最便宜的价格是多少就可以了,维护的过程在枚举卖出的天数的时候就能做到。

2016-10-11 15:10:24 544

原创 LeetCode 53. Maximum Subarray

这道题的题意是给定一个数组,要求求出最大的连续子序列的和。             这道题有很多的做法,而我做的有四种,下面我按照时间复杂度从高到低说明一下这些算法。(1) 最简单的做法是直接枚举左右端点,然后计算两个端点之间元素的和,枚举左右端点复杂度为O(n2),计算和的复杂度为O(n),总时间复杂度为O(n3)。实现比较简单,就         不给出代码。而O(n3)的时间复杂

2016-10-11 14:29:37 257

原创 LeetCode 312. Burst Balloons

本题大概的题意是:给定一个数组,每次删除一个数字,在每次删除的同时得到它与其两边的数字的积的分数(两边没有数字则不乘),删除完之后原来两边的数字就变的相邻了。求可能的最高的分数。         一开始我想用的是贪心的做法:用链表存储整个数组,每次删除不再边界的最小的数。但是这样的方法毫无依据,果然WA了。          接着想到了用递归的方法,每次枚举最后被删除的数字。为了方便描述,

2016-09-26 23:40:54 317

原创 LeetCode 4. Median of Two Sorted Arrays

题意大概是找出两组已经有序的数组合并成的数组的中位数。            本题最简单的做法是利用归并排序的思想,合并两个数组,然后直接找到中间那个数即可。设第一个数组为a,长度为n,第二个数组为b,长度为m,则时间复杂度为O(n+m)。            但这样做是不够的,题目要求时间复杂度至少要达到O(logn)级别才可以。            一开始我想到的做法是,每次把

2016-09-21 13:41:13 305

原创 LeetCode 229. Majority Element II

做完LeetCode 169. Majority Element  后趁热打铁,做了Majority Element II。                   这道题和169相似。差别在于,要找出所有出现次数大于n/3的数字,注意数字可能是不存在的。                   做法也和169相似,注意到数字最多只有两个,所以这次需要假设两个Majority Element,而且

2016-09-12 00:16:09 412

原创 LeetCode 169. Majority Element

课上系统的学习了算法分治的思想,于是想上leetcode找一找关于分治的题目做一做。            一开始选的是 312 Burst balloon, 难度为hard。想了一种贪心的做法,结果WA了。            于是先挑了一道easy的题目来做,就是这道Majority Element。             题目大概的意思就是给定一个数组,请找出其中出现次数

2016-09-11 23:47:31 375

原创 LeetCode 292. Nim Game

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the

2016-09-05 00:13:02 236

原创 LeetCode 338. Counting Bits

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.Example:For num = 5

2016-09-04 23:51:59 249

空空如也

空空如也

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

TA关注的人

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