leetcode
文章平均质量分 66
shenzhu0127
这个作者很懒,什么都没留下…
展开
-
LeetCode - 1. Two Sum
class Solution {public: vector twoSum(vector& nums, int target) { for(vector::size_type i = 0; i != nums.size(); ++i){ for(vector::size_type j = i + 1; j != nums.size(); ++j){原创 2016-04-05 19:18:34 · 954 阅读 · 0 评论 -
LeetCode - 231. Power of Two
这道题目是要求判断一个数是不是2的指数。一开始的想法比较简单,把小于等于这个数的2的指数逐步计算出来,然后每次判断2的指数和这个数是不是相等,如果到最后2的指数大于这个数字的时候还没有相等的情况,那么这个数字就不是2的指数。当然这种方法非常耗费时间,所以在LeetCode上面的得到的是Time Limit Exceeded。public class Solution { p原创 2016-06-27 09:16:02 · 625 阅读 · 0 评论 -
LeetCode - 118. Pascal's Triangle
这道题目是有关三角形的题目,因此可能会涉及到二维数组的问题,在处理这样的三角形问题的时候,有一个比较好的方法就是将三角形当作半个矩阵来看,这样可以比较方便地理清元素下标之间的关系。比如题目中给出的例子是这样:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]我们可以将它这样来对待:[1],[1,1]原创 2016-06-28 12:54:09 · 351 阅读 · 0 评论 -
LeetCode - 62. Unique Paths
这道题是一道典型的动态规划题目,在题目中出现以下情况的话经常要考虑使用动态规划的方法:而动态规划的话,通常会有以下几种类型:Matrix, Sequence, Two Sequences和Backpack。这道题目就是Matrix DP,而在Matrix DP中,有四个步骤需要考虑:state: f[x][y]表示从起点走到坐标x,y...function: 研究最后一步怎么走原创 2016-07-09 17:06:29 · 246 阅读 · 0 评论 -
LeetCode - 64. Minimum Path Sum
和上面的两道题目Unique Paths, Unique Paths II是一样的,都属于Matrix类型的Dynamic Programming问题,不同的是这道题目是要找到权重最小的路径,所以相应的一些分析也要变化一下:state: f[x][y]从起点走到x, y的最短路径function: f[x][y] = min(f[x - 1][y], f[x][y - 1]) + cost原创 2016-07-09 19:29:17 · 260 阅读 · 0 评论 -
LeetCode - 70. Climbing Stairs
求问一共有多少种方式,而且题目中也比较明确地给出了递推关系,所以考虑使用动态规划,这道题属于Sequence DP,一般这种类型的动态规划问题考虑的四个要素如下:而对于这道题目:state: f[i]表示前i个位置,跳到第i个位置的方案总数function: f[i] = f[i - 1] + f[i - 2]initialize: f[0] = 1, f[1] = 1answ原创 2016-07-09 19:48:07 · 196 阅读 · 0 评论 -
LeetCode - 198. House Robber
每一个house都有rob和not rob两种状态,所以我们可以使用一个[n][2]的矩阵来记录每个房子被抢和不被抢的情况下所累计的钱的数量,这道动态规划问题的四要素如下:state: f[i][0], f[i][1]记录某个房子被抢或者不被抢的情况下所累积的钱的数量function: f[i][0] = max(f[i - 1][0], f[i - 1][1]),如果当前的房子不被抢,那原创 2016-07-09 20:40:39 · 404 阅读 · 0 评论 -
LeetCode - 112. Path Sum
遇到Binary Tree相关的问题,自然是要思考recursion和divide and conquer:对于一个root结点,如果它的左子树中有这样一条path,使得所有结点val的和等于sum - root.val;或者它的右子树中有这样一条path,使得所有结点val的和等于sum - root.val,那么就存在这样一条path,使得从root到leaf的所有结点的val和等于sum,基原创 2016-07-09 21:16:12 · 263 阅读 · 0 评论 -
LeetCode - 213. House Robber II
这道题目是House Robber的升级版,在这一题中,房子首尾相连,所以头部的房子和尾部的房子不能同时抢劫,这道题目只是比上道House Robber题目多了这一个限制条件,在上道题目中,第一个房子可以随意选择抢劫或者不抢劫,而这道题目里第一个房子是否抢劫受到最后一个房子是否被抢劫的限制。由于题目的大致结构还是一样的,所以我们洗完更能够利用上道题目的解法来处理这个题目,经过思考后我们可以发现,这原创 2016-07-10 09:22:18 · 357 阅读 · 0 评论 -
LeetCode - 337. House Robber III
这道题目具有Binary Tree的结构并且拥有最优子结构这一性质,也就是说如果我们想从当前的root抢劫到最多的钱,那么我们也希望在root的left和right子树上面抢到最多的钱。题目中已经给出了rob(root)这个函数,所以目前我们需要的就是分析出如何从最优的一些子问题上构造出当前根节点的最优解,也就是怎样从rob(root.left), rob(root.right)中得到rob(ro原创 2016-07-10 09:44:03 · 307 阅读 · 0 评论 -
LeetCode - 55. Jump Game
这道题是一个判断“能不能”的问题,所以想到可以使用动态规划来解决,DP的几个要素如下:state: f[i]表示能否跳到第i个位置function: f[i] = OR(f[j], j initialize: f[0] = truelanswer: f[n - 1]这种方法的时间复杂度为O(n ^ 2),空间复杂度为O(n),在LeetCode上没有通过,得到了TLE的结果,不原创 2016-07-10 11:01:52 · 448 阅读 · 0 评论 -
LeetCode - 242. Valid Anagram
这道题与cc 150 1.3类似,可以有多种解法,最为方便的一种就是排序,然后检查两个String[]是否相等。时间复杂度为O(nlogn),空间复杂度为O(n),代码如下:public boolean isAnagram(String s, String t) { if (s.length() != t.length()) { return false; }原创 2016-07-10 11:25:21 · 259 阅读 · 0 评论 -
LeetCode - 119. Pascal's Triangle II
这道题目与118. Pascal's Triangle很像,所不同的是这道题要求的是打印出制定某行,而上一题则是将所有的全都打印出来。一个非常简单的想法自然是先计算出整个三角形,然后再打印出某个指定的行,但是这样肯定会消耗很多的空间,所以这种做法并不是很推荐。在这道题目上,一开始的时候我的思维走向了歪路,帕斯卡三角形有一个性质就是它的每一行都是二项展开式的系数,所以可以根据这个来直接计算出某一原创 2016-06-28 16:15:46 · 367 阅读 · 0 评论 -
LeetCode - 67. Rotate Matrix
这道题目的思路收到了这篇文章很大的启发:http://www.2cto.com/kf/201410/341031.html首先可以看到,这是一道旋转矩阵的题目,所以首先思考的肯定是寻找原矩阵和旋转90度之后的矩阵的坐标的关系。但是有一个需要注意的问题是,这种寻找规律的问题最好是从简单的情况开始,也就是从n = 1的时候开始,一开始就看n = 4, 5之类的情况的话可能会比较困扰。原创 2016-06-28 11:20:36 · 724 阅读 · 0 评论 -
LeetCode - 54. Spiral Matrix
这道题目也需要寻找矩阵中下标的一定规律,题目中给出的例子是n = 3, m = 3的情况,所以可以先下出来下标的变化情况然后寻找一定的规律。在逐渐寻找规律的时候,可以发现每次都是将外面一层的元素放到ArrayList中,剩下的是里面的一个较小的矩阵,然后同样的流程又会再进行一遍,直到内部没有元素可以迭代,所以一开始我的想法也是进行递归调用。但是这就发现了一个问题,就是Java中好像并没有像Py原创 2016-06-28 18:31:55 · 272 阅读 · 0 评论 -
LeetCode - 59. Spiral Matrix II
题目的大体思想与54. Spiral Matrix一样,都是需要从外圈到内圈访问矩阵,另外注意这道题目有一个小技巧,题目要求的是从1 - n * n,中间是连续的,所以我们只要初始化一个n * n的数组,然后按照从外圈到内圈的顺序,维护一个自增的变量k逐步填入就好。当n是奇数的时候要另外将最后一个数,也就是n * n矩阵的最中间,代码如下:public class Solution{原创 2016-06-28 19:17:14 · 172 阅读 · 0 评论 -
LeetCode - 232. Implement Queue using Stacks
可以用两个stack实现MyQueue这个类,首先要给z原创 2016-06-28 21:20:44 · 173 阅读 · 0 评论 -
LeetCode - 155. Min Stack
这道题的思路并不是算很难,使用两个stack,一个正常存储数据,另一个栈顶存储最小值,每当有元素要push的时候,就和上一个元素进行比较,如果上一个元素小,就再次push上一个元素,如果将要push进的元素小,就正常push这个元素。另外注意pop的时候这两个stack都要进行pop,代码如下:public class MinStack { private Stack sta原创 2016-06-28 21:46:39 · 232 阅读 · 0 评论 -
LeetCode - 136. Single Number
这道题可能一开始的想法是使用哈希表,写法比较简单,这里就不再写了。另一个非常令人经验的解法是使用位运算,位运算有两个性质:a XOR b XOR c = c XOR a XOR b;a ^ 0 = a;a ^ a = 0;所以如果我们将数组中的全部元素都进行异或的运算,所有出现两次的元素都得到0,而0 ^ a = a,所以这样的结果就是要找的数,代码如下:public cl原创 2016-06-28 22:32:29 · 180 阅读 · 0 评论 -
LeetCode - 217. Contains Duplicate
给定一个数组,判断这个数组是否含有重复的元素。这道题看似很简单,直接暴力扫描就可以得到答案,但更重要的是怎样高效率地解出这道题。第一种方法,我们可以使用Java中的Set,Set是一个接口,不能进行实例化,可以使用HashSet对其进行实例化。HashSet有三个特点:不允许出现重复的元素,不保证元素的顺序,可以含有值为null的元素但是只能有一个,代码如下:public class So原创 2016-06-28 23:18:57 · 205 阅读 · 0 评论 -
LeetCode - 49. Group Anagrams
这道题目的基本思想是使用一个Map>来存储grouped anagrams,对于数组中的每一个String,首先将其转化为char[],因为Java中String是不可改变的,然后对转化之后的char[]进行排序,再使用String.valueOf(char[])来得到它所对应的String value,这样所有的anagram都会有相同的String value。接下来检测Map中是否已经含有这原创 2016-07-10 12:56:23 · 300 阅读 · 0 评论 -
LeetCode - 2. Add Two Numbers
一开始的想法是先把两个数都从Linked List中解析出来,相加然后再将其转化为Linked List,但是这种解法非常麻烦,而且这三步完全可以同时进行。首先设置一个dummyNode作为sum表示的起点,然后从两个Linked List的开头逐个数字逐个数字地取出来,将其相加并除以10,记录得到的商和余数,将余数的值作为新节点的value new一个新的ListNode,并将其添加到dum原创 2016-07-10 18:50:16 · 247 阅读 · 0 评论 -
LeetCode - 3. Longest Substring Without Repeating Characters
这道题目的思想是使用一个HashSet来存储Longest Substring Without Repeating Characters,同时使用两个指针i,j分别指向HashSet的第一个元素将要添加的元素,如果j指向的当前将要添加的元素不存在于HashSet中,那么我们就将这个元素加入HashSet,同时更新max的值;如果j指向的当前元素已经在HashSet中,那么我们就删除i所指向的元素并原创 2016-07-10 20:28:24 · 162 阅读 · 0 评论 -
LeetCode - 46. Permutations
第一种方法的思想是不断地向原来list的空隙中添加新的元素,比如对于[1,2,3],首先我们将要返回的结果初始化为[[1]],接下来向结果中的所有list的空隙添加2,也就是[[2,1], [1,2]],最后一步继续向结果中所有的list的空隙中添加3,代码如下:public class Solution { public List> permute(int[] nums) {原创 2016-06-29 11:06:26 · 560 阅读 · 0 评论 -
LeetCode - 31. Next Permutation
这一道题目的思路与上面46. Permutaions(http://blog.csdn.net/shenzhu0127/article/details/51781512)基本一样,是解法二中的一步,同样采用字典序法,可以直接写出来,但是要注意的是在46的解法二中,我们首先对数组进行了从小到大的排序,所以不会出现nextPermute([3,2,1])的情况,故而要加上对这种情况的处理:当出现这种情原创 2016-06-29 11:35:03 · 242 阅读 · 0 评论 -
LeetCode - 47. Permutations II
采用46. Permutation中的第二种字典序的方法的话,会自动去除重复的list,所以可以直接把46的解法二直接拿过来,代码如下:public class Solution{ List> result = new ArrayList>(); public int factorial(int x){ return (x == 0) || (x == 1)原创 2016-06-29 12:52:44 · 194 阅读 · 0 评论 -
LeetCode - 14. Longest Common Prefix
这道题目的解法非常值得借鉴,一开始的思路是先用str[0]开始,逐个增加pre,并且分别检查其他的string是否含有pre作为开头。但是这道题目是首先把pre设置为str[0],并且依次向后检测其他的string是否含有这个pre作为开头,如果没有的话那么就使用String的substring method将pre的长度减一,然后再进行检测。最差的情况下时间复杂度为O(S),其中S为所有stri原创 2016-07-11 13:46:02 · 363 阅读 · 0 评论 -
LeetCode - 274. H-Index
这一题的关键是理解H-Index的定义以及这个定义是怎样反映到数组上面的,有一个易于理解的H-Index的定义是"h指数是一个人发表的所有学术论文中有N篇论文分别被引用了至少N次,他的h指数就是N",有N篇论文被引用了至少N次,注意这里有个至少,这就说明了计算出的H-Index可能有多个,而题目中也说明了这里我们要的是最大的那一个。首先对题目给出的数组进行排序,之后从后向前扫描,这里我们需要明原创 2016-06-29 17:11:48 · 937 阅读 · 0 评论 -
LeetCode - 275. H-Index II
题目说明了数组是已经从小到大排序的,又要求时间复杂度为O(logn),那么这时候就要有使用二分查找的敏感度。二分查找的条件自然就是citations[mid] == (n - mid)。如果(n - mid) > citations[mid],那么说明包括的文章数量多了,应该left++,减小包括文章的范围。如果最后没有找到citations[mid] == (n - mid)的情况,那么retu原创 2016-06-29 18:08:35 · 305 阅读 · 0 评论 -
LeetCode - 98. Validate Binary Search Tree
Binary Search Tree有一个非常重要的性质,它的中序遍历是递增的,这是一个充要条件,可以用它来判断Binary Search Tree,时间复杂度为O(n),代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left原创 2016-06-29 20:02:23 · 256 阅读 · 0 评论 -
LeetCode - 206. Reverse Linked List
迭代法:采用三个指针,分别指向前一个结点,当前结点和下一个结点,将当前结点的next指针指向下一个结点,然后更新前一个节点(prev++)和当前结点(curr++),时间复杂度O(n),代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode原创 2016-06-29 21:03:55 · 206 阅读 · 0 评论 -
LeetCode - 137. Single Number II
int一共有32位,可以将数组中每个元素二进制表示的每一位累加,并且放到一个长度为32的数组中存储,最后对数组中的每个元素进行% 3的运算即可。这个算法是一个通用的解法,只用将算法改成% k即可,算法的时间复杂度为O(32 * n),代码如下:public class Solution{ public int singleNumber(int[] nums){ if(n原创 2016-06-29 22:05:33 · 242 阅读 · 0 评论 -
LeetCode - 225. Implement Stack Using Queues
题目要求使用Queue来实现Stack,我们都知道Queue是FIFO,而Stack是FILO,为了解决这个问题,我们只要在add元素进Queue的时候把之前加进去的元素都poll出来然后再重新add进Queue即可,这样就是实现了FILO的操作。具体的函数实现见下面:整体的代码如下:class MyStack { Queue queue; public原创 2016-07-22 11:33:33 · 1063 阅读 · 0 评论 -
LeetCode - 304. Range Sum Query 2D - Immutable
前面已经做过一道Range Sum Query - Immutable的题目,当时我们采用的方法是新建一个数组存储nums中从0到当前index的元素的和,这样在sumRange方法中我们可以在O(1)的时间中得到结果,在题目要求的sumRange多次调用的情况下非常方便。这里我们同样想要采用相似的方法,于是我们需要另外新建一个二维数组来存储和而不是单个的元素,2D情况下的sumRange分析原创 2016-07-22 11:39:04 · 1180 阅读 · 0 评论 -
LeetCode - 328. Odd Even Linked List
这道题目的思路同样也比较巧妙,在这道题目的解法中,我们并不是一个一个地去移动node,而是分别将odd nodes和even nodes串成两个Linked List,然后再将odd list尾部的next结点指向even nodes结点的头部即可,图片分析如下:代码如下:/** * Definition for singly-linked list. * public cla原创 2016-07-22 11:50:51 · 538 阅读 · 0 评论 -
LeetCode - 299. Bulls and Cows
我们可以使用一个HashMap来记录character和其出现的次数,如果secret.charAt(i) == guess.charAt(i),那么bull++;如果secret.charAt(i) != guess.charAt(i)的时候,secret扫过数字,相应的count加一,guess扫过数字,相应的count减一。若是mark[secret.charAt(i) - '0'] 小原创 2016-07-22 13:29:34 · 500 阅读 · 0 评论 -
LeetCode - 86. Partition List
这道题的思路是先初始化两个list,然后遍历原来的list,发现小于x的分到小的list,反之分到大的list,然后将两个list merge一下,注意头和尾,时间复杂度O(n),空间复杂度O(n),代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * L原创 2016-06-29 22:59:28 · 223 阅读 · 0 评论 -
LeetCode - 260. Single Number III
在Single Number的基础上,只出现一次的数字从一个变成了两个,同样地我们仍然希望使用xor的技巧来方便地得到两个只出现一次的数字,所以我们需要思考一种方法将给出的数字分为两堆,每堆含有的除了一个只出现一次的数字之外,其他都是出现两次的数字。这样我们就可以在这两堆上分别进行xor得到两个值。这里我们采用的方法是首先对所有的数字进行xor,得到的值也就是两个只出现一次的数字的xor值,接原创 2016-06-30 08:38:25 · 296 阅读 · 0 评论 -
LeetCode - 74. Search a 2D Matrix
解法一:又是查找,又是已经排序的数组,所以很容易想到使用二分查找来处理这个问题,首先使用第一次二分查找找到元素所在的row,再用第二次二分查找找到row中的元素,另外在写程序的时候要注意相等时的判断,以及边界条件的处理。还有一个需要考虑的问题就是,二分查找更多的在于一种思想,而并不单单是从已排序的数组中寻找元素的算法,比如这道题目使用第一次二分查找的时候可能无法在每一行的第一个元素中找到tar原创 2016-06-30 10:31:47 · 281 阅读 · 0 评论 -
LeetCode - 240. Search a 2D Matrix II
矩阵中两行或者两列之间的元素的大小并没有一定的规律,所以二分法不太好用,直接用74. Search a 2D Matrix的解法二即可,时间复杂度为O(n + m),代码如下:public class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix == nul原创 2016-06-30 11:09:15 · 317 阅读 · 0 评论