leetcode
文章平均质量分 58
流年冲淡时光
这个作者很懒,什么都没留下…
展开
-
leetcode 二叉树最小深度
刚开始刷leetcode,因为以前刷OJ,代码写的比较随意,所以这里一看就给个类就楞了,想了一会不纠结这个了,开始做题,不敢定义全局变量,后来定义了static变量,写了个递归,结果可能姿势不对,递归段溢出了,然后突然想到用队列套pair,最终过了,看了下讨论区,才发现递归的正确姿势,自己犯傻了,贴上自己的代码:class Solution {public: int ru原创 2016-08-29 20:41:20 · 724 阅读 · 0 评论 -
leetcode之最长连续子串之set和unordered_set.
这题说是O(n)算法,我自己用的set集合,按道理来说时间复杂度是O(nlogn),但是也能AC。看别人都是用hash即unordered_set,这个我不太清楚,可能时间复杂度是O(n)吧:set代码:class Solution {public: int longestConsecutive(vector &num) { if(num.size()==0)原创 2016-09-07 22:18:43 · 649 阅读 · 0 评论 -
leetcode之二叉树最长路径和
做这个题首先要明白path的意思,即为从一个节点到另外一个节点无环路径。然后要注意到有可能有负值节点。然后注意到二叉树大部分题都是递归,这个题当然也可以,因为要求的是从一个节点到另外一个节点的路径和,很容易想到即一个节点的左子树最长路径和右子树最长路径加上本节点的值。另外也要考虑到只有左子树而没有右子树的情况,所以以最长路径和递归的想打是不可取的,所以以子树的最大路径和递归。具原创 2016-09-25 12:42:43 · 4022 阅读 · 1 评论 -
leetcode之回文字串库函数的使用
判断回文字串就不用说了,大家都会,主要是这里的俩个库函数的使用,我忘记了。首先是判断一个字符是数字或者字母的函数:原型:extern int isalnum(int c);用法:#include /* 包含 */功能:判断字符变量c是否为字母或数字说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。然后是把一个字母转换成原创 2016-09-25 13:57:12 · 509 阅读 · 0 评论 -
leetcode之路径和递归
二叉树一般递归,这里注意用递减法,即递减sum的值,另外二叉树递归不要递归到最后一层的后面一层执行一些语句,容易爆栈,可以提前存值:代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tr原创 2016-09-25 14:53:11 · 415 阅读 · 0 评论 -
leetcode之层次遍历,让每个节点的next指针指向右边
总的来说,虽然知道大部分二叉树的题都能用递归来解决,但是有的时候很难想到,这个题又做复杂了。这题我用了队列套pair层次遍历,然后又用vector套pair保存遍历的结果,最后才循环一遍改变next指针。反正写的是最麻烦的,当然越麻烦的越容易看懂,还要记得二叉树千万不要用到最后一层的后面一层,即使不是递归也不行,递归更不行。代码:/** * Definition for bina原创 2016-09-25 16:01:05 · 993 阅读 · 0 评论 -
leetcode之O(1)空间复杂度判断一个整数是否是回文整数
用一个d循环出整数的位数-1,注意不能循环出全部的整数否则会爆int,然后每次比较首位俩位数,然后再去掉首尾俩位数,循环,具体的看代码:class Solution {public: bool isPalindrome(int x) { if(x<0) return false; int high=1; in原创 2016-09-25 21:52:24 · 858 阅读 · 0 评论 -
leetcode之判断中心对称二叉树
这道题其实不难,只要你耐心探索规律,你就会发现,只要每个点的左右节点值等,且左节点的左子节点与右节点的右子节点相等,且左节点的右子节点与右节点的左子节点相等,发图找规律,然后递归就行了。递归代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *原创 2016-09-26 15:03:35 · 582 阅读 · 1 评论 -
leetcode之二叉树层序遍历按行存值
层序遍历很简单,这个题的主要难点在于按层去存取,你可以深搜,用一个标记值记录每层的层数,另外这里有个在空的vector>中存入一个vector的用法之前不会用,挺好用的,代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNod原创 2016-09-26 18:29:20 · 594 阅读 · 0 评论 -
leetcode之层序遍历倒序存储每层的值
reverse一下就好了,不要想太多。代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL)原创 2016-09-26 20:50:18 · 382 阅读 · 0 评论 -
leetcode之O(1)空间复杂度合并俩个数组
这个题做得有点怀疑智商了,看了题,感觉题目的意思就是让用O(1)的空间复杂度来做,但是只想到O(m*n)的时间复杂度的做法,感觉应该不是最优,就直接看答案了,果然不是最优,竟让忘记倒着把值放入数组,呃,做的有点怀疑智商。代码:class Solution {public: void merge(int A[], int m, int B[], int n) {原创 2016-09-26 21:21:18 · 1546 阅读 · 0 评论 -
leetcode之网格从起点到终点的路径数之滚动数组
简单DP,滚动数组解决:class Solution {public: int uniquePaths(int m, int n) { vector f(n,0); f[0]=1; for(int i=0;i<m;i++) for(int j=0;j<n;j++) f[j]=f[j原创 2016-09-26 21:46:18 · 1014 阅读 · 0 评论 -
leetcode动态规划之连续最大子序列和
很经典的题目,当然以前做过,这是我写的代码,好像不够简洁,后面给个更简洁的:class Solution {public: int maxSubArray(int A[], int n) { int flag=INT_MIN; int sum=0; int Max=0; for(int i=0;i<n;i++){原创 2016-09-26 22:00:38 · 740 阅读 · 0 评论 -
leetcode之反转链表的一段长度之插头法
这题刚开始自己写了半天写了一个很麻烦的代码,结果还过不了,还不知道什么地方错了,无耐之下看答案,用插头法进行翻转,既不用调整反转那段链表前面的指针的next指针,也不用调整翻转链表的最后一个节点的next指针,因为用插头法翻转后,刚好调整好前后指针,不懂得话可以画图理解,具体看代码:/** * Definition for singly-linked list. * struct原创 2016-09-26 23:33:33 · 434 阅读 · 0 评论 -
leetcode之链表转换成平衡二叉树
这题起初自己写的,忘记记录中间节点的前面一个节点了,把中间节点算在左子树里面了,所以一直AC不了,后来看了别人写的发现要记录前面一个节点,才想起来自己搞错了,把中间节点算在了左子树里面,其实很简单,具体看代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * Lis原创 2016-09-27 15:48:39 · 1030 阅读 · 0 评论 -
leetcode之卡特兰数
这题用的一个递推关系是AC的,其实写一下很容易就能推出来公式,当然如果了解卡特兰公式的话可以很容易看出来,然后就可以用公式简化时间复杂度,这里我自己不是很了解卡特兰公式,所以用的递推,然后讨论下卡特兰公式:令h(0)=1,h(1)=1,catalan数满足递推式[1] :h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (原创 2016-11-18 13:08:43 · 1255 阅读 · 0 评论 -
leetcode围棋问题
这个题就是著名的连通块问题的变形式,稍微变化下即可AC。代码:class Solution {public: void solve(vector> &board) { if(board.empty()) return; int n=board.size(); int m=board[0].size(); vector原创 2016-09-07 14:53:04 · 1701 阅读 · 0 评论 -
leetcode无向图的复制之搜索
这个题和之前的链表随机指针复制有些类似,所以只能用深度或者广度搜索,因为必须后面的节点出现了,才能构造前面节点的邻接点的集合,具体的看代码:class Solution {public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { unordered_map vertexs;原创 2016-09-04 15:57:02 · 443 阅读 · 0 评论 -
leetcode贪心之gas-station条件决定答案
这个题主要注意俩点:抓住如果有解, 一定是唯一解 的约束条件另外如果总油量小于总消耗的油量表明一定无法走完全程充分说明了题目中给的条件的重要性:代码:class Solution {public: int canCompleteCircuit(vector &gas, vector &cost) { int sum=0,total=原创 2016-09-04 13:30:09 · 383 阅读 · 0 评论 -
leetcode链表O(nlogn)排序
这个题主要考察的是排序思想的应用,虽然可能大部分都知道数组上的排序,但是如果用到链表上,可能有些人可能就会有人一时想不起来,这道题要求O(nlogn)的算法,所以考虑快排,归并,堆排,堆排个人认为不怎么好写,这里不做考虑,主要讲一下快排,归并,以及一种直接调用库函数的写法。首先讲一下最简单的使用库函数的方法,可以说是个投机取巧的方法,直接看代码:class Solution原创 2016-08-31 15:25:26 · 1317 阅读 · 1 评论 -
leetcode之比较两颗二叉树是否完全一样
递归的玩法看样子需要天赋和积累,我的递归都写复杂了,刚开始又想到递归本身,后来想到左右子树都要比较的情况,但是没想到用&&运算符,就写复杂了先贴上我的:class Solution {public: bool isSameTree(TreeNode *p, TreeNode *q) { if(!p&&!q) return true;原创 2016-09-12 13:55:14 · 405 阅读 · 0 评论 -
leetcode之求数组中俩个值和等于给定值用unordered_map降低时间复杂度
这题直接撸了一发O(n^2)时间复杂度,后来想一想,多有不妥,遂看讨论,可以用STL,改成O(n)时间复杂度,O(n^2)很简单,不贴了,贴个O(n)的:class Solution {public: vector twoSum(vector &numbers, int target) { unordered_map map; vector r原创 2016-09-12 14:38:03 · 511 阅读 · 0 评论 -
链表排序之插入排序
这题也是写了好久,可能是对于指针的使用不够熟练,自己写的老实越界,后来受不了了,就看看了别人写的,这里有一个方法,就是加入一个头结点,另外我忘记死循环找插入的位置了,还想到找一个前置节点。另外这个做法比较巧妙的是加入一个头节点,比较值的时候直接使用下一个next的val值,比较巧妙,另外插入的时候,利用头结点加了俩个相同值,然后替换后面一个,相当于直接把要插入的地方,直接置换,后面加上原创 2016-08-31 21:25:29 · 332 阅读 · 0 评论 -
leetcode二叉树遍历
二叉树的遍历主要以根节点为中心展开思路去写,这里先讲下前序遍历非递归,通常的数组二叉树,都是以标记进行,这里由于是链式二叉树,所以可以通过把每个节点的左右节点指向变为NULL,这样第二次遍历到就可以通过左右节点进行判断,从而加入结果遍历中:后序遍历非递归:class Solution {public: vector postorderTraversal(TreeNode原创 2016-09-01 13:39:19 · 631 阅读 · 0 评论 -
leetcode之二叉树遍历求和巧妙递归
和之前那个题一样,递归写的不够巧妙,这里巧妙用了和减值:贴上自己的:class Solution {public: bool hasPathSum(TreeNode *root, int sum) { if(!root) return false; bool result=false; dfs(root,0,原创 2016-09-13 13:46:37 · 2612 阅读 · 0 评论 -
leetcode之求组合数
递归解决:代码:class Solution {public: vector > combine(int n, int k) { vector> v; vector vs; if(k>n) return v; dfs(v,vs,0,k,n); return v; }原创 2016-09-13 14:46:41 · 675 阅读 · 0 评论 -
leetcode之判断是否为平衡二叉树
首先明白平衡二叉树的定义:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树然后要明白一个结点的高度的定义:这个节点到其子树中的叶子节点的最长路径的长度;然后就是递归的写法:class Solution {public: bool isBalanced(TreeNode *root) { if(!root)原创 2016-09-14 15:37:54 · 695 阅读 · 0 评论 -
leetcode链表逆置和合并
当然大部分链表题都可以先把节点值出来进行处理后再放进去,但是这就失去了这些题的意义,这个题主要考查的链表的逆置和合并。首先说一下逆置,逆置,主要需要三个指针,一个指向p1,指向p2,一个指向p3,首先需要p3保存p2的next值,然后才可以改变p2的指针,让其指向p1,然后把p2赋值p1,把p3赋值给p2,以此类推即可完成逆置,至于合并,有些类似,让p1指向第一个链表,p2指向第二原创 2016-09-03 00:29:37 · 341 阅读 · 0 评论 -
leetcode找循环链表的循环点
这个题画图就可以分析出:一个快指针,一个慢指针,如果有循环必定相遇。假设起点到循环点长度为a,相遇点到循环点长度为b,循环剩下长度为c。则很容易得到:2*(a+b)==a+b+n*(b+c);变形得:a=(n-1)*(b+c)+c;可以得出,再次另一个指针指向链表头,和相遇点指针同速前进,必定在循环点相遇。具体代码如下:class Solution {publ原创 2016-09-03 12:52:04 · 1113 阅读 · 0 评论 -
leetcode动态规划之判断一个字符串是否是给定字符串数组组合出来的
简单动态规划,dp[i]表示字符串s[0~i]是否可分的bool值。画表格可以理解:class Solution {public: bool wordBreak(string s, unordered_set &dict) { int len=s.length(); vector dp(len+1,false); dp[0]=tru原创 2016-09-03 14:10:36 · 2286 阅读 · 0 评论 -
leetcode动态规划之字符串切割成语句,单词都在字符串数组中
这道题直接递归会超时,需要先判断这条语句能不能切割再去递归,不会超时。class Solution {public: vector wordBreak(string s, unordered_set &dict) { vector ss; string result; int len=s.length(); if(len原创 2016-09-03 16:02:38 · 1434 阅读 · 0 评论 -
leetcode链表拷贝之随机指针
这题刚开始看见的时候有点懵,不理解题意,后来看了讨论上说,这题主要是因为随机指针,所以拷贝的时候不能给随机指针赋值,因为后面的节点还没copy出来,这题的解决策略是,把对应copy的节点放在对应节点的后面,然后利用被copy的节点的random的next值即可copy随机指针值,然后把被copy的节点和copy的节点分离出来,具体的可以看代码:class Solution {pu原创 2016-09-03 19:55:30 · 382 阅读 · 0 评论 -
leetcode之位运算取得数组中只出现一次的一个数
ones记录只出现过一次的bits,twos记录出现过两次的bits,threes记录出现过三次的bits;仔细理解还是很好理解的,具体看代码:class Solution {public: int singleNumber(int A[], int n) { int ones=0,twos=0,threes; for(int i=0;i<n;i+原创 2016-09-03 22:46:32 · 491 阅读 · 0 评论 -
leetcodd之candy的前后扫描得结果
经典的模式,前后扫描即可得结果:class Solution {public: int candy(vector &ratings) { int n=ratings.size(); vector plus(n); for(int i=1,cur=1;i<n;i++){ if(ratings[i]>ratings[原创 2016-09-04 10:17:14 · 352 阅读 · 0 评论 -
leetcode之数组中找出三个数之和为规定值
这个题可以用set里面套vector 进行去重,起初以为需要重载运算符,其实不用,所以挺简单的:class Solution {public: vector > threeSum(vector &num) { vector> v; set > hash; int n=num.size(); sort(num.begi原创 2016-11-20 17:44:28 · 1818 阅读 · 1 评论