自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

博客已迁移至:lzed.github.io

leetcode代码的github仓库地址:https://github.com/lzed/leetcode

  • 博客(256)
  • 问答 (1)
  • 收藏
  • 关注

原创 Leetcode 136 - Single Number(位运算)

题意给一个数组,里面除了一个数只出现了一次外,其他所有的数都出现了2次。求出只出现了1次的那个数。 要求: O(n)O(n)时间,O(1)O(1)空间思路利用xor的性质:x ^ x = 0,x ^ 0 = x代码class Solution {public: int singleNumber(vector<int>& nums) { int res = 0;

2017-08-11 12:57:01 290

原创 Leetcode 623 - Add One Row to Tree (dfs)

Linkhttps://leetcode.com/problems/add-one-row-to-tree/description/Solution首先,处理特殊情况:若d == 1,新添加的节点将成为根结点 然后,对于一般情况:dfs到d - 1层,根据要求添加节点即可Code/** * Definition for a binary tree node. * struct TreeNode

2017-07-30 17:53:08 337

原创 Leetcode 110 - Balanced Binary Tree (dfs)

题意给一个二叉树,判断是否平衡思路dfs即可。对于一个节点,我们需要求出其左右子树的高度,然后判断是高度差是否小于等于1。但是注意的是如果从上往下做,每次求一下高度,时间复杂度会上升到O(n2)O(n^2),因此需要从下往上做。并且,若对于一个节点,其左右子树中一个不平衡,那么就直接返回不平衡。算法1是用一个pair<int, bool>:其中第一维代表当前节点的高度,第二维表示以该节点为根节点的子

2017-07-08 15:37:15 264

原创 Leetcode 538 - Convert BST to Greater Tree

题意给一个BST,改变其节点的值,将其节点的值加上所有比他大的节点的值思路首先注意是BST,其中序遍历的节点是递增序列。即假设中序遍历后的结果是a0,a1,a2,....ana_0, a_1, a_2, .... a_n,我们有a0<a1<a2<...<ana_0 < a_1 < a_2 < ... < a_n。那么对于aia_i,其改变后的值应该是ai+ai+1+ai+2+...+ana_i +

2017-07-08 14:14:25 266

原创 Leetcode 501 - Find Mode in Binary Search Tree(BST求众数)

题意给一个BST,求val值的众数(可能有多个)follow up:能否只用O(1)O(1)空间呢?(二叉树遍历过程中的栈空间不计入)思路算法1O(n)O(n)时间,O(n)O(n)空间遍历二叉树,并且用一个vis[]数组来记录每个数出现了多少次。为了避免vis[]太大爆内存,可用unordered_map替代算法2O(n)O(n)时间,O(1)O(1)空间我们知道BST一个很重要的性质就是:其中序

2017-07-01 14:25:48 301

原创 Leetcode 563 - Binary Tree Tilt (dfs)

题意给一个二叉树,求二叉树的tilt之和。tilt定义为:对于某个节点,其tilt为左子树的和 - 右子树的和的绝对值思路递归求左右子树的和。对于某个节点,以其为根节点的子树的和为:左子树的和 + 右子树的和 + 当前节点的值在递归的过程中,将abs(左子树的和 - 右子树的和)累加进tilt即可代码/** * Definition for a binary tree node. * struc

2017-07-01 13:11:32 229

原创 Leetcode 543 - Diameter of Binary Tree(树的直径)

题意求树的直径思路首先,树的直径不一定经过根节点。然后,我们想树的直径一定是以某个点作为根节点,然后左子树的最长边 + 右子树的最长边。所以,我们只需要在dfs求最长边的过程中更新一下直径即可。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;

2017-07-01 12:02:53 250

原创 Leetcode 572 - Subtree of Another Tree (dfs)

题意给两个二叉树s和t,判断t是否是s的一个子树思路直接递归就好。首先,p和q分别指向s和t的根节点,如果两个值不等,就应该分别去s的左右子树继续查找。关键是相等的时候:如果判断其子树相同的话,那么成立。如果判断其子树不等,又应该分别去s的左右子树查找代码/** * Definition for a binary tree node. * struct TreeNode { * int

2017-06-30 18:31:15 682

原创 Leetcode 236 - Lowest Common Ancestor of a Binary Tree (LCA)

链接https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/#/description题意给一个二叉树,求两个节点的LCA思路求LCA有很多算法, 有基于RMQ的离线算法,也有倍增,不过这两个写起来稍微麻烦一点。 这里写简单一点的方法算法1假设我们知道每个节点的父节点是谁,求p和q的LCA时,我们先求出这两个节点的

2017-06-30 18:14:42 192

原创 Leetcode 235 - Lowest Common Ancestor of a Binary Search Tree (LCA)

链接https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/solutions题意给一个BST,求两个节点的LCA思路相比于二叉树的LCA就会简单很多,我们只需要从根节点往下走,找到他们俩的分叉点即可。代码/** * Definition for a binary tree node. * st

2017-06-30 17:53:27 209

原创 Leetcode 328 - Odd Even Linked List(链表)

题意将链表按照奇偶分开(节点编号而不是值)思路模拟一下就好,链表题注意边界代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */cla

2017-06-29 19:34:25 257

原创 Leetcode 445 - Add Two Numbers II(链表求和)

题意基于add two number的将2个链表相加,但是要求:不能改变输入的链表思路这道题有很多思路啊,如果能够多开空间的话,直接用一个数组或者栈保存一下链表然后相加即可。如果要求O(1)O(1)的空间,有一个很tricky的思路就是:将两个输入链表从高位往低位相加,然后翻转得到的结果链表,并且进行进位即可。然后还有一个思路就是:要解决的问题就是如何将两个数从高位往低位相加?首先,我们假设两个链表

2017-06-29 19:05:56 440

原创 Leetcode 148 - Sort List(分治法)

题意在O(nlogn)O(nlogn)的时间和O(1)O(1)的空间内对一个链表进行排序思路分治法:归并排序分治法的基本思路:Devide and Conquer对于该题:找到链表中点,并将其从中间拆成两条链表对这两条链表分别进行归并排序将这两条链表进行归并时间复杂度:devide需要进行O(logn)O(logn)次,归并的时间复杂度是O(n)O(n),因此是O(nlogn)O(nlogn

2017-06-29 17:40:35 243

原创 c++中的void指针

基本含义void*在The C++ Programming Language中解释为:pointer to an object of unknown type. 即指向一未知类型的对象。那么我们什么时候会用到或者见到void*指针呢? 在一些底层的代码中,我们可能需要处理一片内存,但是我们并不知道这一块内存存储的到底是什么类型的对象,在之后的例子中将会以memset讲解。使用规则void*可以被

2017-06-28 17:53:04 351

原创 Leetcode 138 - Copy List with Random Pointer(链表复制)

链接https://leetcode.com/problems/copy-list-with-random-pointer/#/description题意一个链表,有三个属性:int lable, RandomListNode* next, RandomListNode* random,其中random可能指向该链表中的任意一个节点或者空结点,要求复制该链表思路我们用L表示原来的链表,L1表示复制后

2017-06-27 21:39:03 300

原创 Leetcode 143 - Reorder List(链表重排)

题意给一个链表L:L0→L1→L2→L3→...→LnL: L_0 \to L_1 \to L2 \to L_3 \to ... \to L_n要求将其转化为:L′:L0→Ln→L1→Ln−1...L': L0 \to Ln \to L1 \to L_{n - 1} ...思路比较综合的一道链表题,分为三步去做:找到链表的中点,并且将链表从中点拆开为前后两条链表将第二条链表翻转按照题意合并第一

2017-06-27 18:33:25 289

原创 Problem D. Cut Tiles - APAC Test 2015 Round A(贪心)

链接https://code.google.com/codejam/contest/3214486/dashboard#s=p3题意想要得到NN个地砖,边长为aia_i的正方形(其中aia_i都是2的指数次幂)。 目前有的地砖大小是M⋅MM \cdot M的正方形,求问需要多少块M⋅MM \cdot M的地砖才能裁出我们需要的?思路贪心。先满足最大的,然后再满足小一点的。但是我不能证明其正确性。

2017-06-24 14:02:43 306

原创 Problem C. Addition - APAC Test 2015 Round A(奇数边)

链接https://code.google.com/codejam/contest/3214486/dashboard#s=p2题意题意给定N个表达式,形如:a+b=3a + b = 3。 又给出M个表达式,形如:a+ca + c。问每一个能否由已知的表达式得到,并给出结果思路明显的图论题。 从样例考虑: a+b=3a + b = 3b+c=3b + c = 3c+d=3c + d

2017-06-23 20:47:22 300

原创 Problem B. Super 2048 - APAC Test 2015 Round A(模拟)

链接https://code.google.com/codejam/contest/3214486/dashboard#s=p1题意基于2048,不过格子大小变为了N⋅NN \cdot N 现在给定一个状态,和当前的操作(上下左右),求下一个状态思路模拟一下就好。 比如向右滑动,那么每一行单独处理,指针指向N−1N - 1的位置,和其右边的一个合并(如果能合并即合并且指针左移2位,否则指针左移一

2017-06-23 20:43:44 305

原创 Problem A. Seven-segment Display - APAC Test Round A(暴力枚举)

链接https://code.google.com/codejam/contest/3214486/dashboard题意一个7段数码管,有未知的几段坏掉了。现在给出一个长度为N的序列,开始的一个数x,然后每一个数依次递减,但是显示出来的是破损后的结果。求问:数码管下一个显示的状态能够唯一确定?思路比较暴力的一个思路,直接暴力枚举可能破损掉的位置(一共127种可能),然后判断是否合法即可。在判断合法

2017-06-22 23:27:34 268

原创 Problem C. Jane's Flower Shop - APAC Test 2017 Round A(牛顿迭代)

题目链接https://code.google.com/codejam/contest/11274486/dashboard#s=p2题意给一个方程,求解思路二分一时脑残写了个牛顿迭代,之前纠结于二分函数不一定单调,其实只要保证解单调即可:因为rr在[−1,1][-1, 1]之间只有1个解,且f(−1)>0f(-1) > 0,所以rr左边f(r)>0f(r) > 0,rr右边f(r)f(r)大于0,

2017-06-21 17:19:30 209

原创 POJ 3737 - UmBasketella(三分)

题目链接http://poj.org/problem?id=3737题意给出一个圆锥体的表面积,求出最大体积,要求精度1e-2思路推一下公式 S=πr2+πrr2+h2−−−−−−√S = \pi r^2 + \pi r\sqrt{r^2 + h^2} 于是推出: h=S2π2r2−2Sπ−−−−−−−−√h = \sqrt{\frac{S^2}{\pi^2r^2} - \frac{2S}{\

2017-06-20 22:56:40 257

原创 Leetcode 542 - 01 Matrix (BFS)

题意给一个01矩阵,要求对于矩阵中的每一个格子找到离它最近的0的距离思路首先,对于为0的格子,距离就为0 然后对于为1的格子,可用它的上下左右四个格子去松弛 所以做一遍BFS就好代码struct node { int x, y, step; node() {} node(int a, int b, int c) : x(a), y(b), step(c) { }

2017-06-12 16:43:46 303

原创 LeetCode Weekly Contest 36

链接https://leetcode.com/contest/leetcode-weekly-contest-36/题目617. Merge Two Binary Trees题意合并两个二叉树。 操作如下: 树A和树B相应节点都有值,相加即可 如果一棵树的相应节点没有值,那么用另一个树的节点思路按照操作递归下去即可代码/** * Definition for a binary tree no

2017-06-11 14:39:17 334

原创 Leetcode 606 - Construct String from Binary Tree (dfs)

题目链接https://leetcode.com/problems/construct-string-from-binary-tree/#/description题意给一个二叉树,要求用括号的形式表示出其前序遍历的结果。要取掉冗余的括号思路dfs 对于一个节点,有以下几种情况: 1. 空节点 2. 非空,无左右儿子:这时候我们将这个节点加入到结果直接返回即可 3. 非空,有左儿子,无右儿子:

2017-06-05 18:25:41 400

原创 基于Socket编程实现FTP客户端

实验环境CygwinPython 2.7FileZella Server原理利用ftp协议进行文件传输时,主要利用两个端口:命令端口(也叫作控制端口)和数据端口。控制端口主要用来传输命令,数据端口主要用于传输数据。 这两个端口一般是20/21,其中20代表主动模式下的数据端口,21代表控制端口。而被动模式下,我们将使用x/21。其中x代表我们被动模式下的数据端口,而21仍然为控制端口(`x

2017-05-23 22:06:37 939

原创 Windows下OpenGL环境配置(vs2015)

环境windows 10visual studio 2015安装好的CMAKE,在这里下载构建GLFW获得GLFW首先,从GLFW官网上下载其源码包(sourse package)解压文件夹使用CMAKE构建GLFW的lib首先,打开CMAKE GUI。 然后,在第一个输入栏(where is the source code)里选择你的GLFW解压后的文件,如图所示: 然后,在

2017-05-10 10:28:14 559

原创 Codeforces 803E - Roma and Poker(dp)

题目链接http://codeforces.com/contest/803/problem/E思路dp状态表示d[i][j]d[i][j],第i局得分为j是否成立转移方程这一局为?,即可能赢,输,平局:d[i][j]=d[i−1][j−1]|d[i−1][j+1]|d[i−1][j]d[i][j] = d[i - 1][j - 1] | d[i - 1][j + 1] | d[i - 1][j]

2017-05-04 17:01:46 310

原创 Codeforces 803D - Magazine Ad(二分)

题目链接http://codeforces.com/contest/803/problem/D题意字符串分成最大k行,使最大的那一行长度尽量小。 划分要求:空格或者-思路二分 二分一下每行最大多长,然后判断即可。代码#include <bits/stdc++.h>using namespace std;inline int in() {int x; scanf("%d", &x); return

2017-05-04 00:08:08 308

原创 Codeforces 803C - Maximal GCD(贪心)

题目链接http://codeforces.com/contest/803/problem/C题意给一个数n和一个数k,要求把n分成k个数a1,a2,...aka_1,a_2, ...a_k的和,并且这k个数严格递增,并且使划分出来的这k个数的GCD最大,求划分方案。思路a1+a2+...+ak=na_1 + a_2 + ... + a_k = n 假设其最大的gcd为x,那么就有:x⋅p1+x⋅

2017-05-04 00:04:53 449

原创 Recent Life & Plan( 无聊的总结)

博客很久没更。距离上次写总结已经过去2个多月啦,这两个多月发生了很多事情。最近一个月太浪了,导致学到的东西并不多。并且仔细回想了一下大学的前三年,好像一直很浪= =,所以感觉成长的并不是很快,也没有达到自己想要的高度。所以,写一下博客,总结一下过去的学习,并且好好计划一下将来吧。寻找实习 ★★★★★课内学习 ★☆课余自学 ★★算法竞赛 ★首先是实习,大概前两个月的主

2017-05-01 00:32:57 277

原创 Leetcode 93 - Restore IP Addresses(回溯法)

题意给一个由数组组成的字符串,要求把这个字符串还原成IP。 结果返回所有合法的IP地址。思路回溯法。 注意前导0的判断。代码class Solution {private: vector<string> ans;public: int Judge(string s) { if (s.length() > 1 && s[0] == '0') return -1;

2017-04-19 16:24:09 309

原创 Leetcode 554 - Brick Wall(HashMap)

题意一个m行的墙,每行由若干个大小不一的砖垒起来的。现在要求找:一条线竖着穿过这面墙,并且穿过最少的砖(横穿,从砖的边上穿过不算)。思路首先,最直接的思路是枚举一下横着穿过的坐标,但是宽度最大到INT_MAX,所以不行。因为所有的砖最多只有只有20000个,所以我们可以枚举砖的边缘。算法1枚举每一行的所有砖的边缘xx,然后判断从这个地方切开会划开几个砖。在求会划开几个砖的时候:维护每一行砖的前缀和,

2017-04-18 15:05:24 350

原创 hihocoder 1269 - 优化延迟(二分 + heap)

题目连接https://hihocoder.com/problemset/problem/1269思路二分缓冲区的大小,在判断答案是否合法的时候,用堆去维护。代码#include <bits/stdc++.h>using namespace std;#define LL long longconst int maxn = 100000 + 5;LL N, Q;LL p[maxn];bool j

2017-04-11 20:43:30 230

原创 Leetcode 309 - Best Time to Buy and Sell Stock with Cooldown(dp)

题意给定一个数组,其中aia_i代表第i天股票的价格为aia_i。你可以进行多次买卖,但是手中最多同时持有1支股票,并且某天卖出股票后,在那之后的一天不能进行任何买卖(cooldown)。 求能获得的最大利润。思路状态表示:d[i,j]d[i, j]代表第i天是否持股。j=1j = 1代表持股,j=0j = 0代表不持股。 状态转移: 1. 如果第i天不持股股票:可能是前一天就没有股票;或者前

2017-04-07 08:59:49 263

原创 排列组合问题及其实现

Permutation不含重复元素问题描述给一个大小为n为数组a,a内的元素互不相同,要求求出A(n,k)​A(n, k)​。思路直接dfs即可。枚举当前位需要放的数字,然后看前面是否出现。代码// a is original arrayvoid dfs(vector<int> t, int step) { if (step == k) { ans.push_back(t)

2017-04-03 13:52:35 317

原创 Leetcode 76 - Minimum Window Substring(Two Pointers)

题意给两个字符串s和t,要求找到s中最小的一段,使:t中的全部字母在s的这一段中出现。要求时间复杂度O(n)O(n)。思路双指针。我们设置两个指针i和j指向s中满足条件的那一段的头和尾。如果当前段满足条件,更新结果并且将i挪到下一个t中出现的字母的位置。如果不满足条件的话,将j后挪一个。我们可以来看看这个模拟过程:在判断是否满足条件时,有两种方法:开一个vis[]和need[]数组,其中need记

2017-04-03 12:08:16 215

原创 Leetcode 49 - Group Anagrams(hash)

题意给一组字符串,要求将里面的anagram分组。样例:["eat", "tea", "tan", "ate", "nat", "bat"]思路暴力的思路算法设置一个vector<vector<int>> v,第二维大小为26,代表的一个字符串中各个字母出现的次数。对于每个新加入的str,遍历v,看是否存在已经满足的映射,如果没有,就在v里面建立新的映射。如果有,找到v里面对应的位置,并且在an

2017-03-31 15:19:09 251

原创 Leetcode - 47 - Permutations II(dfs)

题意给一个数组,数组内可能含有重复元素,求它的所有排列。思路首先,算法基于直接求数组的所有排列, 即Permutations。然后我们只需要考虑去重即可。去重的思路同Combination Sum II:先排序,然后dfs对于两个相同的数,如果它之前的那个数没有使用,那么它也不能使用。代码int vis[10000 + 5];class Solution {private: vec

2017-03-30 10:49:59 282

原创 Leetcode 546 - Remove Boxes(区间dp)

题意有一行方块,每个方块有颜色,现在可以把相邻的k个并且颜色相同的方块消除,得分为k⋅kk \cdot k,求最大得分。思路首先,做一步预处理优化时间:将相邻并且颜色相同的方块合并成段,用c[i]c[i]和len[i]len[i]分别记录这个段的颜色和里面的方块数目。于是以下的操作都是针对段进行。状态表示:d[i,j,k]d[i, j, k],区间[i,j][i, j]内,并且jj段之后还有kk个颜

2017-03-28 09:31:38 1271

空空如也

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

TA关注的人

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