自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 8.3 吝啬SAT问题

首先,我们可以知道STINGY SAT的解是可以在多项式的时间内验证它的解的,所以始于NP问题。另外,可以很容易的将SAT规约到STINGY SAT的(将k设为所有变量的总个数即可),所以可以知道STINGY SAT是NP完全问题。

2018-01-03 16:26:43 251

原创 Leetcode 523

Continuous Subarray Sum问题描述:给定一个数组nums,其中只有正数,和一个整数k,给出是否存在一个最小长度为2的连续的子数组能够被K整除。 算法描述:虽然归类为DP,但是最后用的是贪心算法来做,对于每一个i,都从i到0再遍历一遍,因为需要是连续并且最小长度为2的,所以需要从i-1开始遍历,计算j到i加起来能否整除k。 以下是代码:class Solution {publ

2017-12-28 00:06:07 440

原创 Leetcode 646

Maximum Length of Pair Chain找出最长递增子对,因为有数的大小问题,所以应该要先排序一边,按照子对的第二个数从小到大排序,本来想要直接使用sort函数,但是这个是vector<vector<int>>类型,所以还是自己写了一个冒泡来排序,应该也是因为这里速度比较慢,因为冒泡时间复杂度是O(n^2)的。 算法描述:用了两个数组,一个用来记录当前最小的子对的第二个数num,一

2017-12-27 22:21:59 343

原创 Leetcode 647

Palindromic Substrings问题描述:确定一个字符串里有多少个不同的回文字符串,即时字符串内容相同不同的start location和end location是不同的回文字符串。 算法描述:本来想用DP,但是想到了一个更直观简单粗暴的方法,计算从每一个字符开始,往前推一共有多少个回文字符串,最后把每一个位置都加起来,这样就有三重循环,复杂度为O(n^2). 以下是代码:class

2017-12-27 17:48:57 388

原创 Leetcode 650

2 Keys Keyboard问题描述:一开始只有一个字符A,每一次的操作有黏贴或者复制,每一次只能黏贴上一次复制的内容,需要求出可以通过多少次最小操作步骤得到n个A。 算法分析:刚看到的时候,觉得动态规划的痕迹不是很明显,仔细一想,对于每一个数i的最小操作,要么直接黏贴i次,或者有一个小的数j可以被整除,然后黏贴J-1次,最后加上复制的一次,就是i/j次,所以状态转移方程就是dp[i] = mi

2017-12-26 10:43:25 339

原创 Leetcode 673

Number of Longest Increasing Subsequence问题描述:求一个数组里面最长的递增子序列的总和 算法考虑:用两个数组,一个用来存这个位置的数的最长递增序列的长度,一个用来存这个位置的数对应的最长递增序列有多少个,所以遍历一遍数组,对于每一个数,都遍历一遍前面的数k,如果比它小,并且最长递增序列加一以后大于当前的序列长度,那么就将当前的序列长度改为k的最长递增序列长度

2017-12-25 20:55:52 515

原创 Leetcode 718

Maximum Length of Repeated Subarray找出两个数组的最大匹配子数组,其实就是跟最大的字串匹配一样的,双重循环,构造一个二维的表格,对于每一个格子的填写,如果a[i]!=b[j],那么dp[i][j]=0,如果a[i]=b[j],那么dp[i][j] = dp[i-1][j-1] + 1,这就是转移方程。 以下是代码:class Solution {public:

2017-12-21 00:09:12 359

原创 Leetcode 740

Delete and Earn跟之前的上楼梯问题有点像,其实就是一个数组nums选中了一个数以后,它的连续的前一个或者后一个都要删掉,求可获得的最大的和。 算法过程分析:在到达一个数时,只能选择留下前一个数,或者留下前前一个数加上现在的值,用totol记录某一个数的最大值,那么转移方程为totol[i] = max(totol[i - 1], totol[i - 2] + nums[i]),因为还

2017-12-20 23:49:18 553

原创 Leetcode 746. Min Cost Climbing Stairs

Min Cost Climbing Stairs问题描述:一个数组cost表示每上一级楼梯的花费,可以从第0级开始,也可以从第一级开始,求最小的花费。 切分子问题:除去前面两级台阶,每一级可以是从前一级上来的,也可以从前两级上来的。计算上到某一级的花销为totol[i],递推式为totol[i] = min(totol[i - 2] + cost[i], totol[i - 1] +cost[i]

2017-12-20 16:57:52 1484

原创 416. Partition Equal Subset Sum

Partition Equal Subset Sum就是把一个正数数组分成两个值相等的子集,从这里来看整个数组的值必须是偶数,分成的子集的和就是整个数组的和的一半,所以这就是最终的子集值的目标,这样就可以归类为一个动态规划的问题,定一个数组flag[i],其中i的意思是数字i可以用数个子集来构成值,所以flag[i] = flag[i] || flag[i - nums[j],这样就得到了转移方程。

2017-12-18 00:20:46 157

原创 Leetcode 120.Triangle

Triangle问题描述: 给出一个三角形状的矩阵,找出从上到下的最小路径,每一次只能走相邻的位置,下面是给出的例子:[ [2], [3,4], [6,5,7], [4,1,8,3]]最短路径为11,即2 + 3 + 5 + 1 = 11。 很显然的动态规划的问题 ,每一步都选前面两个中最小的就是最优的了,例如当前在triangle[i][j],之前记录最小路径的矩

2017-12-03 19:58:03 162

原创 Leetcode 714

Best time to buy and sell stocks典型的动态规划问题,给了一个数组,其中记录了每一天的股票值,可以买也可以卖,要先买才能卖,在卖的时候有交易费,返回最大获利的值。对于每一天的,只有两个选择,买和卖。如果买的话,因为是先买才能卖,所以用前一天卖获利的最大值减去当日股票价格,与前一天买的获利值作比较,取最大。如果卖的话,同样是先买了才能卖,所以用前一天买的最大利润减去今日价

2017-11-19 23:52:05 390

原创 Leetcode 139

Word Break这也是一个动态规划的问题,判断一个字符串能否切分成字典里面的单词,切分成子问题就是对于string s中的每一个字符i,如果在他前面的某一个字符j,j前可以切分,从j到i刚好是一个字典里的单词,那么就可以切分,或者从0到i正好也是一个单词。class Solution {public: bool wordBreak(string s, vector<string>& w

2017-11-10 10:49:25 273

原创 Leetcode 213

House Robber II这一题跟上一题其实是一个样子的,但是这一次比较特别,是一个环,跟上一题比较,就需要区别对待一下第一个房子和最后一个就可以了,第一个房子和最后一个房子只能抢一个,所以就需要两遍上一题的过程,判断抢第一个多还是最后有一个多,返回结果。class Solution {public: int rob(vector<int>& nums) { if(nu

2017-11-07 22:07:27 238

原创 Leetcode 198

House Robber一个盗贼只能偷非相邻的房屋,求怎样获取最多的钱。 这是很典型的动态规划问题,对于一个房子,他只能选择偷或者是不偷,这里就需要两个变量来记录一下,一个记录这家偷的金额i,一个记录这家不偷的金额j,那么相应的,因为这家不偷,所以上一家不能偷,i=这家+j,如果这家不偷,j=max(前一家偷了(也就是上一个i),这家的全部金额),最后一家偷完比较i和j哪个大,即为答案。class

2017-11-06 22:50:49 165

原创 Leetcode 303

303. Range Sum Query - Immutable计算出一个数组规定范围内的数值,是一个很简单的问题,但是根据题目的提示,数组不变并且会被多次调用求和一个范围的值,这就可以用要用动态规划来做,需要使用表格存储从0加到当前的和的数值,然后只要相减就可以得到规定范围内的数值,所以只需要O(mn)的时间复杂度就可以完成,并且表格可被多次使用。class NumArray {public:

2017-11-05 23:36:51 207

原创 Leetcode 621

Leetcode 621, Task Scheduler题目描述:有A-Z种任务,每个任务有i个,规定在同一种任务必须间隔n个以上,求最小的执行时间。 思路:先求出每一种任务各有多少个,然后排序,将最多的取出来,留下n个空间,然后把剩下的比它少的插进去,如果所有的间隔都插满了,那么执行时间间隔就是任务的总数,这里的间隔即时插满了,如果还有任务未填充,依旧可以填充到尾部不算溢出,因为题目只要求间隔n

2017-10-29 20:56:28 304

原创 Leetcode 649, Split Array to Consecutive Subsequences

leetcode 649返回是否能把一个升序的数组分成若干个最小长度为3的连续数字串。听起来有点像蜘蛛纸牌一样的东西。解决办法就是把数组从头到尾扫一遍,每读入一个数字i,如果有以i-1结束的串就把这个数字加到这些串里最短的串的的后面,然后将以i-1结尾的串更改为以i结尾的串,没有就放到一个空串里面,最后检查这些串里面有没有长度小于3的。 不需要具体的记录每一个串,只需要记录每一个以i结尾的串的长度

2017-10-29 18:24:27 255

原创 Assign Cookies

Leetcode 455, Assign Cookies两个数组,一个代表每个孩子需要的cookie数量,一个是每一份cookie一共有多少个,cookie为一份一份的分给孩子们,一开始时先对两个数组排序,然后逐个比较。 以下是代码:class Solution {public: int findContentChildren(vector<int>& g, vector<int>& s

2017-10-29 10:31:17 251

原创 Leetcode 210

Leetcode 210这个问题就是将有优先权的先输出,所以可以用BFS的拓扑排序来解决,先把边绘制成邻接表,在绘制的时候把入度也计算好,然后对所有的节点进行遍历,没有访问且入度为0则对其做BFS,在BFS的过程中,访问了一个节点,就要把该节点的邻居节点的入度-1并且再检查如果入度为0了,那就放入队列中进行BFS,最后如果是有环的那么最后存放顺序的vector中的节点数量是小于节点总数的,所以可以判

2017-10-15 16:21:18 223

原创 Leetcode 107

Leetcode 107, Binary Tree Level Order Traversal II按二叉树一层一层来输出数据,使用BFS来解决,问题的关键是要一层一层来解决,本来想要一个数字记录当前的层数,但是这样越想越麻烦,最后参照了solution里面的用队列的size来控制当前的层数,最后再使用reverse函数把顺序反转。 以下是代码:class Solution {public:

2017-10-14 19:47:02 389

原创 Leetcode 101

Leetcode 101, symmetric trees判断一棵树是不是对称的,只要判断左右子树是否对称,BFS是用队列来完成的,所以每一次将子节点放到队列里面的时候,要按照对称的顺序来放,放置顺序:左节点的左节点,右节点的右节点,左节点的右节点,右节点的左节点,这样访问的时候每次取的两个节点就是需要判断是否对称的节点。 以下是代码:class Solution {public: bo

2017-10-14 19:22:38 302 1

原创 690 leetcode employee importance

690 leetcode employee imortance, 难度easy由于上周老师讲的是BFS,所以这周就做了这道BFS相关的题。 因为给的数据里包含一个结构体,所以先把它转换成矩阵比较方便,然后再用BFS进行解决。时间复杂度的计算应该要分成两部分来看,转换成矩阵的部分为O(n^2),

2017-10-03 17:18:44 289

原创 Leetcode 207

Leetcode 207, Couese schedule, 难度medium这道题可以用DFS用拓扑的思想来解决,跟普通的dfs不一样,不仅需要记录已经访问过的节点,还需要记录当前正在访问的节点,因为拓扑就是判断是否是有向无环图,所以在从某一个节点开始进行深搜的时候,它的邻居结点如果又访问到了原来的节点那就是有环,当这个有向无环图可以分成两个强连通部件的时候,从一个强连通部件指向另一个已经访问过的

2017-09-25 17:53:30 250

原创 Leetcode 113

Leetcode 113, Path Sum II,难度medium这道题跟112也是相似的,但是这道题需要输出符合的序列,但是仍然可以在112的基础上修改就可以了,需要记录已经经过的路径,然后作为递归函数的参数传递,最后判断是否符合题目条件然后压入vector中。 以下是代码class Solution {public: vector<vector<int>> pathSum(Tree

2017-09-23 13:47:07 218

原创 Leetcode 111

Leetcode 111, Minimum Depth of Binarytree, 难度easy这道题跟112是一样的,只要稍微的改一下就可以了,也就是在每一次递归时将层数加一,最后对比左子树和右子树的层数,将小的层数返回。 “`C++ class Solution { public: int minDepth(TreeNode* root) { int res

2017-09-23 11:50:16 262

原创 Leetcode 112, Path Sum

Leetcode 112, Path Sum, 难度easy这周上的是DFS,所以就先做了这道DFS的题,解题思路就是深搜一遍,到达一个结点时先判断左右子节点是否为空,都为空说明是叶子节点,然后判断当前的和是否等于sum返回true or false,非叶子节点则进行下一步的深搜。 以下是代码:class Solution {public: bool hasPathSum(TreeNod

2017-09-23 11:29:55 125

原创 Leetcode 240, Search a 2D matrix

Leetcode 240, Search a 2D matrix, 难度medium这个还是有关分治的问题,就是在一个单行或者单列的有序数组里面查找一个数,因为是有序的,所以可以根据单行进行二分查找,所以就是对每一行进行一次二分查找就可以了。 以下是代码:class Solution {public: bool searchMatrix(vector<vector<int>>& matr

2017-09-17 14:14:14 218

原创 Leetcode 215

Leetcode 215, Kth largest element,难度medium这个还是分治算法,用了快排的思想,调用一次快排,返回基准值在数组里面的位置与K-1比较,如果正好等于K-1那就可以返回这个数,如果小于说明要找的数还在右边,需要对右边再进行一次快排,大于则是在左边,再对左边进行一次快排。 以下是代码:class Solution {public: int findKthL

2017-09-15 23:14:03 614

原创 Leetcode 53, Maximum Subarray

Leetcode 53, Maximum Subarray, 难度 easy仍然是用的分治,把一个数组拆成两半,这样就有了三种情况,有可能在左边,也有可能在右边,有可能是左右两边加上中间,返回的时候有三种情况加以判断,从中间开始往两边进行遍历。 以下是代码:class Solution {public: int maxSubArray(vector<int>& nums) {

2017-09-15 11:52:56 105

原创 Leetcode 169

Leetcode 169, majority element, 难度 medium因为这周正好在学分治,所以就做了这道分治的题目,就是不停地把数组分为两半,找到在这两半里面最多的元素,如果在这两半里面最多的元素相等,那这个就是majority,如果不等,那就遍历一边数组check是左边的元素多还是右边的元素多,返回多的元素,这里遍历用了容器里的count函数。 以下是代码:class Soluti

2017-09-14 23:29:32 254

原创 Leetcode 54, Spiral Matrix

Leetcode 54, Spiral Matrix, 难度medium就是按照规定顺序输出一个矩形,用四个变量保存了边界,然后对每一条边进行循环读入,处理一下相应的边界问题,复杂度为O(n),遍历了一遍数组。 以下是代码:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) {

2017-09-09 15:59:22 121

原创 Leetcode 2, Add Two Numbers

Leetcode 2, Add Two Numbers, 难度medium。这是一个把数字逆序相加的题目,把数字按照逆序放置省去了考虑最低位对齐的问题,只要把每一个节点里面的数加起来判断是否下一位需要进位然后修改carry标识,最后将数除十取余放入新的链表节点中。并且需要判断两个链表是否为空,看了discuss发现自己写的确实啰嗦了,只需要一个三元表达式就可以了。 以下是代码:class Solu

2017-09-09 11:30:56 120

原创 Leetcode 661

Leetecode 661, Image Smoother,难度easy就是把一个矩阵周围的数字求和求平均取整,所以只要判断周围一共有多少个数,并且加起来就可以了。所以这里需要遍历一遍数组,把每一个数周围都处理一遍,在第二重循环里面有一个temp记录周围的数的总和,count记录周围一共有多少个数,一个数不处在边界上都是八个数,所以需要判断周围的数有没有超出边界,没有加起来,最后求平均取整放入最终

2017-09-09 00:17:12 350

原创 Leetcode 121

Best Time to Buy and Sell Stock, Leetcode 121, 难度easy首先说一下对题目的理解,总的来说就是要找到两个数之间的差绝对值最大,并且被减数在数组中的位置要在减数的前面。 然后就是用一个minprice来记录当前最小的价格,然后每一次遍历的时候进行比较,小于minprice则将数组当前值赋给minprice,另外需要一个参数来记录最大的利润也就是最大的差

2017-09-08 23:24:11 231

空空如也

空空如也

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

TA关注的人

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