- 博客(31)
- 收藏
- 关注
转载 LeetCode(29) - Divide Two Integers
这道题要求的是完成整数的除法运算,不能用乘除和mod来求。既然不能够用乘除和取模,能用的就只有加减和位移。 思路比较抽象,直接说不好理解,举个例子,假设被除数是28,除数是5,则在第一个循环里,我们需要找到2^n满足2^n * 5 < 28,事实上我们知道,当n=2时,有4*5 = 20, n = 3时,8*5 = 40,所以我们n取2,得到28至少有4个5相加,此时28...
2016-03-16 13:45:00
115
转载 LeetCode(28) - Implement strStr()
这道题事实上就是编译一个String.indexOf()的函数,所以这道题直接用s1.indexOf(s2)便可解。但是这样做没有什么意义, 所以我们还是老老实实的一个一个遍历,当碰到首字母相同的时候,就判断加下来的字符串和needle是否相同,如果不相同,继续遍历。 代码如下: 1 public class Solution { 2 public int ...
2016-03-16 12:08:00
81
转载 LeetCode(27) - Remove Element
这道题要求的是在数组nums里面删除和给定的target相同的数字。如[1,3,2,3,2,4,5],target = 2。最后输出是[1,3,3,4,5]。 首先,输出的顺序并不做要求,第二,数组也不是sorted。思路总体来说和LeetCode26是相同的,就是把target相同元素用其他数字代替,因为返回的是数组的长度,所以我们可以优先从数组后面不同的元素来替换。举个例子...
2016-03-16 12:00:00
75
转载 LeetCode(26) — Remove Duplicates from Sorted Array
这道题要求的是在一个sorted好的数组nums里面“删除”重复的数字。因为题目要求返回的是数组的长度,所以事实上并不是删除,而是把重复的数字用后面不一样的数字一一替代,用count记录重复的个数,最后返回nums.length - count就好了。说起来有点抽象,举个例子,假设nums = [1,2,2,3,3,4,5];当index = 2的时候,因为2是重复,所以要用后面第一...
2016-03-16 11:15:00
80
转载 LeetCode(25) - Reverse Nodes in k-Group
这道题是在一个List里面每k个node为一个group,然后反转。这里有几个要点,1.判断这个group能不能翻转,如果group的个数小于k,则不翻转),2. 翻转list,leetcode 206,3. 翻转之后与前后group要链接上,并且进行下一个group的翻转。整道题思路简单,但是容易出错,特别是在第3步,所以这是一道hard的题,难就难在细节的地方。 代码如下:...
2016-03-15 11:56:00
79
转载 LeetCode(24) - Swap Nodes in Pairs
题目要求很简单,就是把list里面的node两两互换。 当做比较复杂的LinkedList的题目的时候,最好是在草稿纸上画一画,走一遍流程,凭空想很容易会出错。这一题时LeetCode 25的k=2特殊例子,所以要简单很多。用两个node,一前一后,然后两两交换就好,细节上注意的是交换后两个node前面和后面是否各自连接上。最好自己在纸上走一遍,防止出错。 代码如下:...
2016-03-15 11:28:00
93
转载 LeetCode(23) - Merge k Sorted Lists
题目和LeetCode(21)里merge two sorted List要求差不多,现在只是从2两个list变成了k个list。 看到这个题,第一个反应是用一个heap(最大堆)把k个list里面的数存起来,然后一个一个poll出来生成一个新的list。遍历所有list要O(n),再堆里面插入元素,需要O(log(n))的时间,再生成新的List需要O(n),所以平均时间为O...
2016-03-15 11:20:00
86
转载 LeetCode(22) - Generate Parentheses
题目要求给你一个数字n,代表有n个括号()。然后输出n个括号可能的组合。如n=2时,就是"()() (())"。 如以前讲过,当需要列出所有可能的组合的时候,我们优先想到的就是backtracking。思路大概是这样子:用两个数字left和right纪录当前“剩余”(还没有没有加上)的括号数,对于其中一层递归,当加一个左括号,left减1,进入下一层。而在当层,如果right ...
2016-03-15 10:51:00
83
转载 LeetCode(21) - Merge Two Sorted Lists
题目要求是,给你两个sorted LinkedList,然后把它们两个合并成一个新的LinkedList。思路很简单,就是比较ListNode L1 和 L2,哪个小就把那个node放到新的list里,并且移动相应ListNode的指针(L1或L2)。注意其中一个为null,另外一个不为null的时候别漏掉就好。 代码如下: 1 /** 2 * Definitio...
2016-03-15 10:40:00
65
转载 LeetCode(20) - Valid Parentheses
题目要求是这样,给你一串只包含符号的字符串,看看这串符号合不合法。怎么算合法呢?"()()()"和"[{}]()"都算是合法,但"([)]"就不合法了。 思路很简单,通过上面举的例子,我们可以看出来,一个右括号的出现,其合不合法,取决于最后出现的的左括号能不能对应起来,如果不能对应(如"("和"]"),则返回false。而最后出现的左括号,最优先要被判断,所以只是一个典型的后进...
2016-03-13 15:27:00
62
转载 LeetCode(19) - Remove Nth Node From End of List
题目要求是,给你一个单向链表,和一个数字n,删除该链表倒数第n个node,其中测试案例中n能保证一定有效。 思路很简单,用两个指针,它们两个相隔为n,当后面的指针指向链表尾的时候,前面的指针指向的node的下一个node,就是要删除的那一个。 代码如下: 1 /** 2 * Definition for singly-linked list. 3 * ...
2016-03-13 12:49:00
55
转载 LeetCode(18) - 4Sum
思路和3Sum一样,只是把O(n^4)变成了O(n^3),思路详细见3sum。最终能够ac。 代码如下: 1 public class Solution { 2 public List<List<Integer>> fourSum(int[] nums, int target) { 3 List<List&l...
2016-03-13 12:39:00
100
转载 LeetCode(17) - Letter Combinations of a Phone Number
经典的backtracking(回溯算法)的题目。当一个题目,存在各种满足条件的组合,并且需要把它们全部列出来时,就可以考虑backtracking了。当然,backtracking在一定程度上属于穷举,所以当数据特别大的时候,不合适。而对于那些题目,可能就需要通过动态规划来完成。 这道题的思路很简单,假设输入的是"23",2对应的是"abc",3对应的是"edf",那么我们在...
2016-03-13 12:23:00
94
转载 LeetCode(16) - 3Sum Closest
这一题和leetCode(15)的3sum基本上一个思路 —— two pointer。而且题目保证只有有一个答案,所以还不需要考虑重复的问题,只需要维护一个与target差值最小的closeDistance,以及对应的数组上的值就好。 代码如下: 1 public class Solution { 2 public int threeSumClos...
2016-03-13 11:48:00
61
转载 LeetCode(15) - 3Sum
这道题给你一个数组,找到所有三个数加起来等于0的数字并存到List里。暴力搜索的话大概要耗费O(n^3)的时间,但是如果这个数组是有序的话,搜索起来就会相对简单,排序大概要花费O(nlog(n))的时间,有序搜索只需要花费O(n^2)的时间,所以,思路是这样:先排序。外循环i纪录第一个数字,内循环采用2 pointer的方法,当sum>0,tail往左移,sum &...
2016-03-05 07:42:00
78
转载 Leetcode(14) - Longest Common Prefix
这道题要求给你一组字符串数组strs[],找到整个数组的所有字符串里最长的前缀,如(["abc","abde,"abcad"],最长的前缀是"ab"])。 这题比较简单,思路是这样子:一开始,把strs[0]当成是最长的前缀prefix,然后从strs[1]开始遍历,找到strs[0]和strs[1]前面公共部分,更新prefix,然后继续遍历,直到整个数组遍历完毕或者pref...
2016-03-05 07:26:00
62
转载 LeetCode(13) - Roman to Integer
这题和12题是刚好反过来,给你的是一个罗马数字,然后输出一个int。对于这题我并没有用到数组,只根据罗马数字的规则从右往左处理就好,碰到数字比右边最大的要小就减(如IV,右往左读,读到I发现比V要小,故-1),不然就加。代码如下: 1 public class Solution { 2 public int romanToInt(String s) { 3 ...
2016-03-05 07:02:00
60
转载 LeetCode(12) - Integer to Roman
本题的要求是把阿拉伯数字转化成罗马数字,这题唯一的难点,可能就是要了解罗马数字的规则,了解了以后,就没什么难的了。因为罗马数字的规则相对比较复杂,如果想要查看罗马数字的规则,网上有很多资料可以查询。剩下的就是简单的逻辑问题了。做这道题有两个方法,一个是建一个罗马数字初始数组,通过不断调用该数组来构成罗马数字。第二种就是通过不断的判断来完成。这两种方法,第一种较快,但需要一些额外的空间...
2016-03-04 12:21:00
75
转载 LeetCode(11) - Container With Most Water
这一题讲的给你一个数组height,数组上的数字代表X轴在index点上的高度,现在要求的是,取拿两个点,使两点之间能盛的水最多。我们知道,能够盛的水的高度的取决于较矮的一个的高度。假设水的容积为s,则两点之间水的容积为s = (index2 - index1) * Math.min(height[index2], height[index1])。暴力搜索O(n^2)虽然能够解决问题...
2016-03-04 11:31:00
64
转载 LeetCode(10) - Regular Expression Matching
非常challenge的一道题,考虑的情况特别多,当考虑到了之后,还要考虑怎么处理。题目要求是,给你两个字符串,判断正则字符串能不能表示待检字符串,一个是"aabb",另外一个是正则表达式"a*.*"。该正则表达式只有两种特殊符号,一种是'.',代表的是任意字符,另一种是'*',它单独出现没有任何意义,要搭配前一个如"a*",则说明a可以连续出现零到多次,根据这个定义,上面给的例子返...
2016-02-29 05:14:00
107
转载 LeetCode(9) - Palindrome Number
题目要求判断一个整数是不是回文数,假设输入是1234321,就返回true,输入的是123421,就返回false。题目要求in-place,思路其实很简单,在LeetCode(7)里面我们刚好做了reverse integer,我们就可以利用reverse integer得到一个reverse number,然后和输入作对比,如果与输入一致,则返回true,如果不一致,则返回fal...
2016-02-29 04:53:00
52
转载 LeetCode(8) - String to Integer (atoi)
虽然是easy,却是比较繁琐的一道题,需要考虑各种边界条件。在WA了好几遍之后,才把各种边界条件给补全。需要考虑到的因素如下:输入不合法字符,非"0-9",对于首位,合法字符还包括"+"和"-"来代表正负号;最前面允许出现很多个空格,即" 56";当中间出现不合法字符,输出该不合法字符前面有效字符,如"+56a123",输出就是56;注意越界的情况。...
2016-02-29 04:25:00
77
转载 LeetCode(7) - Reverse Integer
题目的要求就是要反转一个Integer,例如输入123,则输出321,这一题比较tricky的地方就是它有可能越界,就是说1234567899,反过来是9987654321是一个越界的Integer,按照题目要求,碰到越界返回0,就好。关键的地方就在于,怎么判断它是否越界呢?一开始为了处理这个越界的问题,我才用了一个大小为10的int数组来存每一位,通过处理最高位来判断是否越界,后来...
2016-02-28 14:45:00
71
转载 LeetCode(6) - ZigZag Conversion
这个题的要求是给你一个字符串,和一个行数,例如(s = "mysisteristhemostlovelygirl" , row = 4),每一行一个字符串,但是s却得按照zigzag的方式重排序到这4行的字符串里,什么意思呢? 看例子大概就懂了: m e e o i y t r h m l v g r ...
2016-02-28 14:22:00
56
转载 LeetCode(5) - Longest Palindromic Substring
这道题要求的是给你一个string, 如“adcdabcdcba",要求返回长度最大的回文子字符串。这里有两个条件,一是子字符串,而是回文。用纯暴力搜索的话,需要用到O(n^3)的时间,必然超时。就算经过细节上的优化,它也有一个很长的test case不一定能过得去(说不一定是因为有时能过有时不能过),先贴上这个O(n^3)的代码,其实可以不用仔细看,面试用这种方法可不能过,所以大概...
2016-02-28 13:52:00
54
转载 LeetCode(4) - Median of Two Sorted Arrays
题目要求很简单,就是给你两个已经排好序的数组nums1(长度为m)和nums2(长度为n),找出他们的中间值。返回值类型double是因为如果数字个数是偶数个,就要返回中间两个数的平均值。这题最简单的方法就是通过两个指针分别从nums1和nums2的头一直移动,直到走到nums1和nums2的中值位置为止。整个过程耗时大概是O((m+n) / 2)。但是题目附带需要用O(log(m+...
2016-02-28 13:03:00
68
转载 浅谈Spark(2) - RDD
Spark依赖于一个很特别的数据抽象,叫做弹性分布式数据集(resilient distributed datasets),也就是RDD,它是一个被集群分区(partitioned)的in-memory read-only对象。每一个RDD都是根据range(partitioning of consecutive records),或者是每条记录的key的hash值来进行分区。当然这...
2016-02-26 16:24:00
123
转载 LeetCode(3) - Longest Substring Without Repeating Characters
这题的题意大概就是给你一个字符串"abcdecde",找到最长的子字符串长度,里面所有的子母都不重复。本例子中最长的满足条件的子字符串就是"abcde",所以应该返回的是5。这一题如果不用暴力解决的方法的话,我优先想到的数据结构是HashMap,因为它能够判断字母是否重复,并且记录每个字母的index。而现在唯一的难点就是,怎么通过HashMap来找到这个最长字符串。因为要记录子字符...
2016-02-26 14:08:00
85
转载 LeetCode(2) - Add Two Numbers
一道比较基本的LinkedList的题目。题目要求是这样,现在有两个LinkedList,(2 -> 4 -> 3)和(5 -> 6 -> 4),然后从头开始,把每个node的value相加,最终输出的结果应该是:(7 ->0 ->8)。这里需要注意的边界条件有两个,一个是两个链表长度不一样的问题,另一个是进位的问题,注意了这两个问题以后,问题就...
2016-02-26 13:24:00
169
转载 LeetCode(1) -Two Sum
题目要求很简单,给你一个数组(例如,nums = [2,7,11,15])和一个target(target = 9),找到数组里两个数相加后能得到target的这两个数的index。在本例中,返回的应该是[0,1]。 碰到这样的题目,首先应该想到的是运用HashMap,记录数组里的每个元素和对应的index,把O(n^2)的问题转变为O(n)的问题,然后再第二次遍历数组,当cu...
2016-02-26 13:00:00
51
转载 浅谈Spark(1) - Overview
Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。 举个例子,当有一个应用,需要...
2016-02-25 15:59:00
83
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人