- 博客(95)
- 收藏
- 关注
原创 LeetCode 225 Implement Stack using Queues
要求实现一个基本栈的操作:push(int),pop(),top(),empty(),只能使用标准Queue中的操作。在java中,Queue是一个接口,LinkedList类实现了这个接口,我们可以使用两个LinkedList来模拟Stack的操作,因为queue是先进先出,所以每次pop和top查询时利用两个queue,一个queue;不断pop,只到最后一项,然后返回最后一项,并将其他的项存入另一个queue中,来模拟stack的后进先出。
2017-11-03 11:33:33 198
原创 LeetCode 204 Count Primes
给一个数n,要求给出小于n的素数的数量。常用的素数筛选方法有埃氏筛选法和欧拉筛选法,具体方法参考大佬博客,先创建一个大小为n+1的boolean数组flag,用来标记是否是素数,另创一个int表prime用来存当前筛选出的素数,欧拉筛法与埃式筛法的区别在于欧拉筛法是用当前已筛选出的素数再去累乘来继续筛选,时间复杂度更低。
2017-11-02 15:44:09 204
原创 LeetCode 560 Subarray Sum Equals K
给一个数组nums和一个整数k,要求在数组的连续子集中找到sum等于k的个数。两点要求:1. 数组长度在1~20000之间。2. 数组中的数在-1000~1000之间,k的取值范围在-1e7~1e7之间。在进行统计之前先进行计算这个数组的前n项累加和,将和统计到数组sum中,sum[i] 代表从nums[0]项开始累加到nums[i],之后统计是否存在起点j和终点i,使得两者之间的值之和等于k,即sums[i] - sum[j] + nums[j] == k。
2017-10-29 16:31:10 310
原创 LeetCode 19 Remove Nth Node From End of List
给一个链表,去掉从后面数第n个结点,并且返回链表的首结点。要求:给定的n一定为有效合法的值,并且尽量一步达到要求。常规思路是先计算链表的长度len,之后计算正序idx = len-n,然后进行删除结点算法,
2017-10-28 14:04:10 189
原创 LeetCode 647 Palindromic Substrings
给一个字符串,要求数出这个字符串的子串中有多少个是回文串,不同起点的子串即为不同。字符串长度不超过1000。对于每一个字符,它本身一定是一个回文串,所以我们可以枚举每一个字符作为回文串中心,向外扩展,extendPalindrome函数可以借鉴题目5.Longest Palindromic Substring,分为单个中心和两个字符为中心的情况来讨论,向两边来扩展,每次统计结果+1即可。
2017-10-28 13:39:41 172
原创 LeetCode 137 Single Number II
给一个数组,在这个数组中除了一个数只出现过1次之外,其他数都出现过3次,要求找到这个只出现过一次的数,要求线性时间复杂度并且要求不另开内存空间。问题的关键就是设计一种方法可以记录状态,这种状态在出现3次的时候可以恢复如初,借鉴网上大佬的思路,对于每一个32bits的数,我们可以统计每一位上1的个数,假如一个数出现了三次,那么它的二进制位上对应为1的次数也为3的倍数,最后模3,假如不是0,则说明这一位是要找的那一个数的某一位,将这一位记录下来,最后统计相或即可。
2017-10-28 13:08:55 156
原创 LeetCode 3 Longest Substring Without Repeating Characters
给一个字符串,要求找到其最长的独特字串,这个独特字串中每一个字符都在这个子串中只出现过一次。我们可以定义两个指针指向匹配字符串的左右边界,初始为0,0,维护一个代表已出现过字符的下标的映射,每次只需要查找s[r]在映射中的数值,比较其与当前下标的关系,例如“abcabcbb”,l=0,r=0,映射pos中pos['a'] = 0,当遇到第二个‘a'时,pos['a'] = 0,在[l, r)的区间之内,所以将调整到pos['a'] +1的位置,更新r,当遇到pos中没出现过的,则更新ans的大小值,维护p
2017-10-18 17:27:07 167
原创 LeetCode 12 Integer to Roman
先给出百度百科关于罗马数字的书写规则:基本字符 IVXLCDM相应的阿拉伯数字表示为 1510501005001000相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;正常使用时、连写的数字重复不得超过三次;在一个数的上面画一条横线、表示这个数扩大 1000 倍。
2017-10-11 09:20:23 149
原创 LeetCode 438 Find All Anagrams in a String
给一个字符串s(未知是否为空),和一个模版字符串p(不为空),要求找到以模版字符串p的字母排列组合后形成的字符串在s中的序的集合(vector)。我们可以统计模版字符串中各个字母出现的次数,放在数组model中,之后从0开始遍历s,将从i到i+p.length()-1的字母出现次数存放在数组v中,每次维护数组v,并比较v和model是否相同,相同则将当前i加入到ans中即可。
2017-09-19 10:10:32 277
原创 LeetCode 7 Reverse Integer
给一个数,将这个数反转过来,假如反转之后对于signed-int而言会溢出的话,那么就返回0,否则返回反转之后的数。我们可以在int和long long分别设置一个变量,用于存储所给数的绝对值反转之后的数,之后判断这两个临时变量是否相同,假如不相同,则说明存在溢出,否则再判断是否是负数,返回正确答案。
2017-09-19 09:36:03 314
原创 LeetCode 160 Intersection of Two Linked Lists
先定义两个指针分别指向两个链表的首节点,两个变量统计两个链表的长度,然后分别遍历一遍统计长度,将指向长度较长的那个指针指向到某一结点使得从此节点开始的剩余长度与短的链表长度相同。之后分别从两个指针所指向的位置开始遍历,返回第一个相同的节点,假如没有,则返回NULL。
2017-09-13 15:24:56 131
原创 LeetCode 14 Longest Common Prefix
写一个程序找到有你个字符串数组中最长的公共前缀字符串。因为已经规定是前缀,所以只需要从前开始匹配,看到第几位开始字符串之间出现的差异,那么长度就是这个位数减一。
2017-09-13 15:14:32 154
原创 LeetCode 633 Sum of Square Numbers
给一个非负的整数c,判断是否存在两个整数a,b满足a2 + b2 = c。c是非负的,所以a和b的取值可以为0,所以a和b取值应该是[0, sqrt(c)],从0到sqrt(c)枚举一遍,假如c-a*a开平方后可以整除1,那么说明此时的a,b满足条件。
2017-09-13 14:54:20 156
原创 LeetCode 58 Length of Last Word
给一个字符串,由字母和空格组成,问最后一个单词的长度,一个字母也可为一个单词。从后向前找第一个字母,之后再找到连续字母的长度,即为所要求的长度。
2017-09-13 14:43:28 157
原创 LeetCode 101 Symmetric Tree
给一个二叉树,判断这棵树是不是关于中心轴镜像对称的,首先,要搞清楚镜像对称的特点,即左手为右手,右手为左手,,,在这颗树的判断中就是对应的两个节点中的一个左节点等于与其对应的另一个节点的右节点,另一个节点也相互对应。
2017-09-12 16:46:17 177
原创 LeetCode 141 Linked List Cycle
给一个链表,判断是否有环,,,要求是不使用额外的空间。我们可以定义两个不同步速的指针,slow和fast,假如不存在环,那么fast永远不会等于slow,fast步速较快,先一步到达结尾NULL,加入存在环,那么一定存在某一步数,fast赶上了slow,此时slow和fast相同,,,我们可以利用这种方法实现不开额外空间判断环的存在。
2017-09-12 15:51:23 162
原创 LeetCode 9 Palindrome Number
判断一个数是不是回文数,且要求不使用额外空间,负数一定不是回文数,所以我们只需要将原数不断模10,除以10,并将其个位加到 新数的个位上,即可实现数的反转,最后判断反转后的数和原数是否形同,假如相同,则为回文数。
2017-08-11 14:21:35 186
原创 LeetCode 441 Arranging Coins
给n个硬币,要求按要求排成多行,第k行需要k个硬币,返回可以按要求排成行的行数。组成1行,需要1个组成2行,需要1+2个组成3行,需要1+2+3个组成4行,需要1+2+3+4个组成5行,需要1+2+3+4+5个。。。。。。。可推出公式组成n行,需要(1+n)*n/2个题目要求给出硬币,求出共有多少完整的行,就是对所推的公式求解,直接返回即可。
2017-08-10 19:42:36 196
原创 LeetCode 374 Guess Number Higher or Lower
有一个猜数字的游戏,事前在1~n之间拿走一个数,然后告诉你n,每次猜一个数,假如拿走的数比你猜的数大,就返回1,小就返回-1,相同返回0,通过这个API,实现程序猜出这个数是什么。我们可以二分查找这个数,初始l = 0,r = n,每次判断guess(mid)的情况,根据guess(mid)的值来选择下一步。-1 : r = mid - 1 1 : l = mid + 1 0 : return mid由于假如n为int界限的值,那么l+r就会越界,发生计算错误,所以中间变量不能用int。
2017-08-10 17:12:58 193
原创 LeetCode 26 Remove Duplicates from Sorted Array
给一个已经排好序的数组,要求去除其中重复的元素,并返回新的数组的长度。要求不得申请额外的空间。我们可以用两个指针,一个遍历数组,另一个用于指向下一个不重复的数,当便利数组的指针读取到当前数和前一个数相同时,跳过操作,继续遍历,当读取到不相同,则更新另一个指针所指向的位置的数,将这个不相同的数存在指向的位置,依次向后枚举判断。
2017-08-09 11:03:46 143
原创 LeetCode 119 Pascal's Triangle II
给一个序号k,要求返回第k行Pascal三角的数字。注意第k行是从0开始计数的。要求仅使用O(k)的额外空间。我们可以直接申请大小为k的数组,初始化为1,由于递推式nums[row][col] = nums[row-1][col-1] + nums[row-1][col]所以我们可以对每一行从后向前递推计算数值,循环k+1次,即为所需要的行。
2017-08-09 08:17:20 133
原创 LeetCode 367 Valid Perfect Square
给一个正整数,要求实现判断它是否为一个数的平方。不可以使用库函数中的sqrt函数。利用二分查找算法,每次查找中间值,判断中间值的平方和num之间的关系,实现过程中注意int的越界问题,中间变量应当使用long long类型变量。
2017-08-08 17:04:11 206
原创 LeetCode 257 Binary Tree Paths
给一棵二叉树,要求求出所以从根到叶的路径,并将路径压入vector中返回。普通先序遍历的基础上,每到一个节点,进行判断是否为叶子结点,假如是叶子结点,那么就将path压入vector,否则,将当前path递归进下一层。
2017-08-08 16:16:07 146
原创 LeetCode 345 Reverse Vowels of a String
给一个字符串,要求只把其中的元音字母的顺序反转,而保持辅音字母顺序不变。将字符串s中所有的元音字母提取出来,单独翻转后,再将只含元音字母的字符串替换进源字符串去。另一种思路是设置两个指针,分别从首尾开始循环找元音字母,找到后交换两个字母的位置,直到循环结束,实现反转。
2017-08-08 15:45:30 294
原创 LeetCode 118 Pascal's Triangle
给一个行数,代表的是Pascal三角形的层数,要求用vector存储Pasicl三角,并将其返回。通过观察可以得知,Pasicl三角的第i层有i个元素,且对于非首行,非首列,非末列的元素而言,元素的值等于上一层左右连个节点之和,即nums[i][j] = nums[i-1][j-1] + nums[i-1][j]。
2017-08-07 15:54:48 183
原创 LeetCode 66 Plus One
给一个用数组表示的非负的数,现在把这个数加1,返回vector形式的数。不允许前置0,除非这个数是0。这个数越大的位越在前面,所以个位应在vector的末尾,依次向前,位数不断变大。可以先将数组反转,用一个变量标记是否有进位,将最后一位加1,然后依次判断是否大于9,在运算时加上进位数,再取模10。之后判断是否还有进位,有则向数组中加入新数,无则不加,最后反转数组。
2017-08-07 14:51:37 162
原创 LeetCode 235 Lowest Common Ancestor of a Binary Search Tree
给一个二叉搜索树,找到给定两个节点的最低的公共祖先节点。这题首先应考虑二叉搜索树的性质,对于每一个节点,左子节点小于父节点,右子节点大于父节点,所以最低的公共祖先节点一定符合p和q分布在其左支和右支上的性质,通过判断p,q的val与root的val大小,判断p,q在root的哪边分支上,然后递归或循环,直到root满足左右分支分别有一个p或q为止。
2017-08-07 11:31:06 183
原创 LeetCode 198 House Robber
假设是一个小偷(这比喻,,,),在这条街上有一排房子,每一个房子都有一个确定的价值,相邻的房子不能连续偷窃,问,偷了这条街后,最大偷窃的价值总和是多少?利用DP思想,对于从第4个房子开始,有两种选择,偷或不偷,假如不偷,则集成上一个房子的价值,假如偷,那么再从隔一个的还是隔两个的两个之间选择一个最大的加上这一个房子的价值,核心式是:dp[i] = max(dp[i-1], max(dp[i-2], dp[i-3]) + nums[i]);同时更新ans,因为每一个房子的dp值都是目前看来最大的,所以只
2017-08-05 20:18:35 292
原创 LeetCode 53 Maximum Subarray
给一个数组,找到它的连续最大子串和是多少,并返回最大和。我们采用dp的办法,对于非首的节点,都有两种选择,延续之前的或者另开一个子串,判断条件就是,假如之前的子串和大于零,那么对于这个点而言,不论正负,延续前子串是最大的办法,而假如前子串和是小于0的,那么另开一个子串是最大办法,相当于假如要在负数和0之间选择,那会选择0而不会选择负数。
2017-08-05 19:44:59 156
原创 LeetCode 437 Path Sum III
给一棵二叉树,其中每个节点包含一个整数值。给定一个值sum,要求找到路径和为sum的路径的个数。路径不需要从root开始或结束,但必须向下(只能从父节点到子节点)数的节点数不超过1000个,取值范围在-1000000到1000000之间。由于路径并不要求必须以叶子为终点,所以不能写从叶子向上递加的算法,通过观察得出,每一个非叶子结点都可以作为一段路径的起点,而每一个非根节点结点都可以作为一段路经的终点,所以我们可以遍历整个树,枚举所有可能的起点,对与每一个起点进行搜索,以其开始的路径是否有长度为sum
2017-08-05 18:52:49 182
原创 LeetCode 107 Binary Tree Level Order Traversal II
给一个二叉树,要求按照从底层到顶层的顺序遍历整个二叉树,每一层的节点从左到右输出。在递归的同时维护一个变量depth,表示当前的深度,每次向表示当前深度的vector添加节点,最后把ans反转一下顺序,就变成了从底层项顶层的顺序。
2017-08-05 12:57:15 153
原创 LeetCode 572 Subtree of Another Tree
给两个非空的二叉树s和t,编写函数实现判断t是否为s的子树。其中,s也可以是它自己的子树。先序遍历二叉树s,当判断s当前结点的val和t的val相同,则进入判断子树的函数,同步遍历s和t,看是否完全相同,假如不相同,则进行下一层遍历。
2017-08-05 10:33:23 180
原创 LeetCode 108 Convert Sorted Array to Binary Search Tree
给一个排好序的数组,要求把数组转化为一个深度平均的搜索二叉树。对于二叉树,父节点一定 大于左子节点,小于右子节点,所以对应数组而言,父节点应为中间值,比它小的数放在左边,大的数放在右边,依次递归下去。
2017-08-04 22:39:13 177
原创 LeetCode 543 Diameter of Binary Tree
给一棵二叉树,要求寻找其中最长的路径,其中,路径的定义是任意两个节点之间的距离,,最长的路径也可能不经过根节点。通过观察可以得出,对于一个父节点,两个子节点都存在的节点而言,经过它的路径有两个方向可以选择,假如从左子节点传入,可从右子节点传出寻找最大长度,也可能从父节点传出寻找最大长度,假如只有一个子节点,那就只能选一条路。利用遍历,从下层递归到上层,便可得到最大长度。
2017-08-04 18:24:11 168
原创 LeetCode 268 Missing Number
给一个数组,包含n个不同的元素,找到与0,1,2,3,4,,,,,n这个数组相比缺少的数,比如,数组[0, 1, 3],缺少2。要求时间复杂度是线性的。前几天做了一个类似的题目:LeetCode 645 Set Mismatch,一直在考虑利用下标做标记的方法,结果写的很麻烦,之后突然想到能不能用一个固定的数做差这种方法得出结果,然后写出了第二种思路,把所有数加起来,和从(0~n)的总和做差,差即为缺少的数
2017-08-04 17:04:41 142
原创 LeetCode 350 Intersection of Two Arrays II
给两个数组,实现求出两个数组的交集,并返回vector,要求返回的结果中单种元素出现次数应与两个数组中较小保持一致。不要求顺序。我们可以先判断一下两个数组是否为空集,之后给nums1排序,之后枚举nums2中的元素,假如nums2[i]在nums1中存在,则将此元素加之至返回结果中,并从nums1中删掉此元素。为了优化时间,将nums1排序后可以使用二分查找方法。时间复杂度 m*log(n)。
2017-08-04 16:23:19 164
原创 LeetCode 447 Number of Boomerangs
给定平面上所有两两不同的n个点,“boomerang”是一个点(i,j,k)的元组,使得i和j之间的距离等于i和k之间的距离(按照元组的顺序)。编写函数求boomerang的数量。n至多为500,点的坐标都在10000, 10000(包括)范围内。对于每一个boomerang,都存在一个中心点,即i点,枚举i点,记录i到其他个点的距离,看是否有相同的距离,假如有多个,则在其中选两个,构成组合数,2 * C(2, n),n为距离相等的数量,对于每一组,顺序都可以反转,所以需要乘两倍。
2017-08-04 16:03:21 248
原创 LeetCode 100 Same Tree
给两个二叉树,要求实现判断这两棵树是否相同。假如两棵树相同,那么对于树上对应的每一个节点,都应该相同,采用中序遍历的办法,一边判断,一边遍历。
2017-08-04 14:33:51 185
原创 LeetCode 21 Merge Two Sorted Lists
两个有序的单链表,要求将这两个链表组成一个新的有序链表,返回新链表的头指针。给了两个指针 l1 和 l2,分别指向第一个链表和第二个链表,主要思路就是利用循环判断当前 l1 所指向的 val 和 l2 所指向 val 谁小,让node指向小的那个,并循环下去,当有一个链表指针循环结束而另一个还没有,则令node指向剩余链表即可,因为,剩余的都要比现在所有的节点大,所给的节点是有序的。
2017-08-04 10:56:09 184
原创 LeetCode 643 Maximum Average Subarray I
给一个有n个元素的数组,找其中平均值最大的长度为k的子串,要求返回最大的平均值。其中:1<=k<=n<=30000nums[i] ~ [-10000, 10000]先算出前k个元素的sum,之后依次向右枚举,每次删掉最左边的元素,加上最右边的元素,相当于窗口移动,并在每次移动时,更新maxSum。当枚举结束后,返回 maxSum / k。
2017-08-03 10:17:35 792
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人