- 博客(20)
- 收藏
- 关注
原创 LeetCode No.96 Unique Binary Search Trees
题目:给定一个数n,那么我们可以生成多少种结构唯一的二叉搜索树(包含全部的1~n)呢?例子:n = 3,那么应该有5种BST,如下所示: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / /
2017-08-20 22:00:57 207
原创 LeetCode No.95 Unique Binary Search Trees II
题目:给定一个整数n,生成所有的包含1~n的结构唯一的二叉搜索树(BST);例如,n = 3的话,则应该生成5个唯一的二叉树,表示如下: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / /
2017-08-20 21:26:33 219
原创 LeetCode No.143 Reorder List
题目:给定一个单向链表L: L0,L1,…Ln-1,Ln;将其重新排序为:L0,Ln,L1,Ln-1,L2,Ln-2…必须就地重排并且不能交换节点中的值;例子:1->2->3->4,返回:1->4->2->3思路:仔细观察我们可以发现,这道题的返回结果中,链表前半部分节点的相对顺序没有发生变化,而后半部分节点的相对顺序发生了逆转;那么我们就可以先将链表的后半部分反转,然后再
2017-08-19 19:24:51 262
原创 LeetCode No.86 Partition List
题目:给定一个链表和一个值x,划分链表使得所有小于x的节点出现在所有大于等于x的节点之前,并且保持这些节点的相对顺序不变。例子:1->4->3->2->5->2 x = 3,则应该返回 1->2->2->4->3->5;思路:这题既然是要把链表划分为两部分,那么我们不妨创建两个新的头节点,一个链接划分后的链表的前半部分,一个链接划分后的链表的后半部分。然后我们在遍历链表
2017-08-19 15:18:34 230
原创 LeetCode No.82 Remove Duplicates from Sorted List II
题目:给定一个链表,删除其中所有值重复的节点,只保留原始链表中没有重复值的节点。注:这题不同于我们通常理解的去重操作,这题是要把重复的节点统统删除,一个不留!例子:1->2->3->3->4->4->5,应该返回 1->2->5,值为3和4的节点一个不留!思路:当我们发现前后两个节点的值不相等时,这证明前一个节点肯定不是要删除的节点,而后一个节点则不能保证,所以这时,我们要处理的链表规
2017-08-18 23:13:58 215
原创 LeetCode No.61 Rotate List
题目:将链表的后k个节点转到前面,这k个节点的顺序保持不变,其中k为非负数。这是一道双指针方法的题,思路本身并不难,这道题的难点是代码的鲁棒性!思路:创建两个指针,他们之间相差k步;同时递进两个指针,直到第二个指针的next指向nullptr,这时我们就确定了要旋转的区间;旋转链表;鲁棒性:首先就是head为nullptr时,代码不能崩溃;题目中说k是非
2017-08-18 22:41:46 167
原创 LeetCode No.25 Reverse Nodes in k-Group
题目:给定一个链表,每次反转k个节点,返回修改后的链表。k是一个正数,并且小于等于链表的长度;如果链表的长度不是k的整数倍,那么最后剩下的节点顺序不变。要求空间复杂度O(1);例子:1->2->3->4->5,k = 3,则返回 3->2->1->4->5;这道题其实和它的上一道题,也就是 Swap Nodes in Pairs 如出一辙,k = 2时就是同一道题!那么我们
2017-08-18 22:11:58 198
原创 LeetCode No.24 Swap Nodes in Pairs
题目:给定一个链表,交换两个相邻的节点,并返回头节点。例子:给定 1->2->3->4,返回 2->1->4->3;这道题看上去很简单,其实也很简单,交换两个节点并不难,难在如何让前面已经交换过的一对节点能正确地和后面那对交换过的节点链接起来!思路:我们可以创建一个新的头节点phead,phead.next = head,然后我们每次交换之后更新这个phead的next指针,并且更新指
2017-08-18 20:47:59 261
原创 LeetCode No.23 Merge k Sorted Lists
这一题是说要合并k个有序链表,显然可以借助合并两个有序链表来做,问题的关键是时间复杂度!两个链表的合并操作时间复杂度为O(m + n),其中m和n为两个链表的长度,那么直观来讲,k个链表,如果我们一次将每个链表都合并到第一个链表,那么时间复杂度将是O(kn1 + (k - 1)n2 + (k - 2)n3 + ... + nk),这复杂度很高!我们发现上述方法中l1被遍历了多达k次,这究竟
2017-08-16 20:46:00 148
原创 LeetCode No.21 Merge Two Sorted Lists
这道题涉及一个很基本的操作——合并,合并在归并算法中很常用!题目:将两个有序链表合并为一个有序的链表,新的有序链表使用之前的两个链表拼接而成。这个题的思路很简单,让我们直接看代码,同时要注意代码的鲁棒性!要注意l1或者l2为nullptr的情况,不要让程序崩溃!/** * Definition for singly-linked list. * struct ListNode
2017-08-16 20:18:25 192
原创 LeetCode No.19 Remove Nth Node From End of List
题目:给定一个链表,删除链表的倒数第n的节点,并返回其头节点。例子:1->2->3->4->5,n = 2,那么返回结果应该是:1->2->3->5注:给定的n一个是一个合法的值。 尝试在一次遍历中完成。我们知道,单向链表是不可能倒着遍历的(除非借助栈这样的结构,并且需要额外的非常数的存储空间),那么我们如何在一次遍历中确定我们当前遍历到的点就是倒数第n个节点呢
2017-08-16 20:12:08 185
原创 浅谈二分查找
如果你学习数据结构已经有一段时间了,那么我相信对于二分查找,你一定不会陌生,但是如果你还没听说过斐波那契查找,那么我想这篇文章值得你一读~接下来我们就从最基本的二分查找说起,来聊一聊关于二分查找的各种变化版本。
2017-06-05 23:14:54 460
原创 LeetCode No.9 Palindrome Number
这是一道很有意思的题,首先来看一下题目:一、题目与分析判断一个数是否是回文序列,不使用额外的空间;首先一个数怎么是回文呢?很简单,比如:123321,111111,12321等等,这样的数就叫回文数;那么判断回文最直接的思路就是先把这个序列反转,然后看看反转之后的结果是不是和原序列相同,如果相同那就是回文,如果不同就不是。而且我们在第7题的时候已经解决了反转数字的问题,那么这道题也
2017-05-31 00:10:05 218
原创 LeetCode No.8 String to Integer (atoi)
我们都知道在C标准库里有这样一个函数叫atoi,它的参数是const char*,返回值是一个int;那么在C++标准库里面有一个与之对应的函数叫做stoi,它接受的字符串参数类型变成了const string&;LeetCode上面的这道题是这个函数的简化版本,这道题看起来简单,但是在实际编程中有很多细节需要处理(涉及Math的问题总是有很多细节需要处理!)一、题目及其分析
2017-05-23 21:36:40 172
原创 LeetCode No.5 Longest Palindromic Substring
说实话,看到回文的题,我的本能是拒绝的...更何况还是一道最长回文子串的问题!哈哈,虽然不喜欢这类题,但是我们不能就此放弃,言归正传,先来看一下题目:给定一个字符串s,找到其中最长的回文子串,假设s的长度不超过1000。唔,这个假设非常的耐人寻味,为什么要限定s的长度在1000以内呢,我猜想解决这道题的算法的时间复杂度可能很难降到很低,估计很难在O(n)的时间内完成!一、首
2017-05-17 20:15:34 217
原创 LeetCode No.7 Reverse Integer
这是一道很有意思的题,它将教会我们如何拆分一个整数的各个数位,题目是这样的:将一个整数中的数字顺序反转,例如:x = 123,return 321;x = -123,return -321;那么如何对一个数字反转呢,你可能会想到将数字转化为字符串,然后翻转字符串,再将字符串转换回数字;这样做可行,但是太麻烦,我们说整数是可以直接反转的,只要我们将它的每一位拆出来就可以了,那
2017-05-16 22:18:08 265
原创 LeetCode No.3 Longest Substring Without Repeating Characters
这是一道关于字符串的题,首先我们还是先来理解一下题目:给定一个字符串,求出其中不包含重复字符的最长子串的长度。 首先我们思考一下如何确定字符串中包含重复字符呢,也就是说当我们顺序遍历这个字符串,遍历到某一个字符时发现该字符与之前遍历过的某个字符相同,那么最粗暴直接的方法就是将当前字符与之前遍历过的每个字符依次进行比较,我们知道这样做时间复杂度将达到O(n^2),这还仅仅
2017-05-15 20:41:38 205
原创 LeetCode No.2 Add Two Numbers
给定两个非空链表分别代表两个非负的整数,数字是按照逆序存储并且链表中的每一个节点代表一位数字,现将两个数字相加并返回使用链表表示的结果。
2017-05-15 20:26:09 186
原创 LeetCode No.1 Two Sum
这是LeetCode的第一题,难度为easy,就让我们先从读题开始吧~题目:给定一个整数的数组,返回两个元素的索引,这两个元素之和要等于一个给定的值target;假定每一组输入仅有唯一的解,并且同一个元素不能被使用两次。看一个样例:nums = [2, 7, 11, 15], target = 9;因为nums[0] + nums[1] = 9;所以应该返回[0, 1]
2017-05-09 23:26:45 267
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人