- 博客(30)
- 收藏
- 关注
原创 leetcode之链表转换成平衡二叉树
这题起初自己写的,忘记记录中间节点的前面一个节点了,把中间节点算在左子树里面了,所以一直AC不了,后来看了别人写的发现要记录前面一个节点,才想起来自己搞错了,把中间节点算在了左子树里面,其实很简单,具体看代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * Lis
2016-09-27 15:48:39 1029
原创 leetcode之反转链表的一段长度之插头法
这题刚开始自己写了半天写了一个很麻烦的代码,结果还过不了,还不知道什么地方错了,无耐之下看答案,用插头法进行翻转,既不用调整反转那段链表前面的指针的next指针,也不用调整翻转链表的最后一个节点的next指针,因为用插头法翻转后,刚好调整好前后指针,不懂得话可以画图理解,具体看代码:/** * Definition for singly-linked list. * struct
2016-09-26 23:33:33 433
原创 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 739
原创 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 1013
原创 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 1545
原创 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
原创 leetcode之二叉树层序遍历按行存值
层序遍历很简单,这个题的主要难点在于按层去存取,你可以深搜,用一个标记值记录每层的层数,另外这里有个在空的vector>中存入一个vector的用法之前不会用,挺好用的,代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNod
2016-09-26 18:29:20 592
原创 leetcode之判断中心对称二叉树
这道题其实不难,只要你耐心探索规律,你就会发现,只要每个点的左右节点值等,且左节点的左子节点与右节点的右子节点相等,且左节点的右子节点与右节点的左子节点相等,发图找规律,然后递归就行了。递归代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *
2016-09-26 15:03:35 577 1
原创 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 855
原创 leetcode之层次遍历,让每个节点的next指针指向右边
总的来说,虽然知道大部分二叉树的题都能用递归来解决,但是有的时候很难想到,这个题又做复杂了。这题我用了队列套pair层次遍历,然后又用vector套pair保存遍历的结果,最后才循环一遍改变next指针。反正写的是最麻烦的,当然越麻烦的越容易看懂,还要记得二叉树千万不要用到最后一层的后面一层,即使不是递归也不行,递归更不行。代码:/** * Definition for bina
2016-09-25 16:01:05 993
原创 leetcode之路径和递归
二叉树一般递归,这里注意用递减法,即递减sum的值,另外二叉树递归不要递归到最后一层的后面一层执行一些语句,容易爆栈,可以提前存值:代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tr
2016-09-25 14:53:11 414
原创 leetcode之回文字串库函数的使用
判断回文字串就不用说了,大家都会,主要是这里的俩个库函数的使用,我忘记了。首先是判断一个字符是数字或者字母的函数:原型:extern int isalnum(int c);用法:#include /* 包含 */功能:判断字符变量c是否为字母或数字说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。然后是把一个字母转换成
2016-09-25 13:57:12 509
原创 leetcode之二叉树最长路径和
做这个题首先要明白path的意思,即为从一个节点到另外一个节点无环路径。然后要注意到有可能有负值节点。然后注意到二叉树大部分题都是递归,这个题当然也可以,因为要求的是从一个节点到另外一个节点的路径和,很容易想到即一个节点的左子树最长路径和右子树最长路径加上本节点的值。另外也要考虑到只有左子树而没有右子树的情况,所以以最长路径和递归的想打是不可取的,所以以子树的最大路径和递归。具
2016-09-25 12:42:43 3998 1
原创 leetcode之判断是否为平衡二叉树
首先明白平衡二叉树的定义:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树然后要明白一个结点的高度的定义:这个节点到其子树中的叶子节点的最长路径的长度;然后就是递归的写法:class Solution {public: bool isBalanced(TreeNode *root) { if(!root)
2016-09-14 15:37:54 693
原创 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 674
原创 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 2611
原创 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
原创 leetcode之比较两颗二叉树是否完全一样
递归的玩法看样子需要天赋和积累,我的递归都写复杂了,刚开始又想到递归本身,后来想到左右子树都要比较的情况,但是没想到用&&运算符,就写复杂了先贴上我的:class Solution {public: bool isSameTree(TreeNode *p, TreeNode *q) { if(!p&&!q) return true;
2016-09-12 13:55:14 404
原创 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 647
原创 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
原创 leetcode无向图的复制之搜索
这个题和之前的链表随机指针复制有些类似,所以只能用深度或者广度搜索,因为必须后面的节点出现了,才能构造前面节点的邻接点的集合,具体的看代码:class Solution {public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { unordered_map vertexs;
2016-09-04 15:57:02 443
原创 leetcode贪心之gas-station条件决定答案
这个题主要注意俩点:抓住如果有解, 一定是唯一解 的约束条件另外如果总油量小于总消耗的油量表明一定无法走完全程充分说明了题目中给的条件的重要性:代码:class Solution {public: int canCompleteCircuit(vector &gas, vector &cost) { int sum=0,total=
2016-09-04 13:30:09 383
原创 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 351
原创 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
原创 leetcode链表拷贝之随机指针
这题刚开始看见的时候有点懵,不理解题意,后来看了讨论上说,这题主要是因为随机指针,所以拷贝的时候不能给随机指针赋值,因为后面的节点还没copy出来,这题的解决策略是,把对应copy的节点放在对应节点的后面,然后利用被copy的节点的random的next值即可copy随机指针值,然后把被copy的节点和copy的节点分离出来,具体的可以看代码:class Solution {pu
2016-09-03 19:55:30 382
原创 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
原创 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 2276
原创 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 1110
原创 leetcode链表逆置和合并
当然大部分链表题都可以先把节点值出来进行处理后再放进去,但是这就失去了这些题的意义,这个题主要考查的链表的逆置和合并。首先说一下逆置,逆置,主要需要三个指针,一个指向p1,指向p2,一个指向p3,首先需要p3保存p2的next值,然后才可以改变p2的指针,让其指向p1,然后把p2赋值p1,把p3赋值给p2,以此类推即可完成逆置,至于合并,有些类似,让p1指向第一个链表,p2指向第二
2016-09-03 00:29:37 341
原创 leetcode二叉树遍历
二叉树的遍历主要以根节点为中心展开思路去写,这里先讲下前序遍历非递归,通常的数组二叉树,都是以标记进行,这里由于是链式二叉树,所以可以通过把每个节点的左右节点指向变为NULL,这样第二次遍历到就可以通过左右节点进行判断,从而加入结果遍历中:后序遍历非递归:class Solution {public: vector postorderTraversal(TreeNode
2016-09-01 13:39:19 625
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人