Leetcode
文章平均质量分 75
BSeanSun
这个作者很懒,什么都没留下…
展开
-
Remove Element
这题比较奇怪,他的test case会检查你是不是把elem真的移走了,我试过用A[i]^elem 去除掉elem,结果就果断不对,但是题目里又说It doesn't matter what you leave beyond the new length.public int removeElement(int[] A, int elem) { if(A==null||A.le原创 2015-01-26 12:58:20 · 294 阅读 · 0 评论 -
Unique Paths
这个题一看就是动态规划了,每走下一步的方法都是左边往右+上边往下的和。数学上看其实就是求 C(m+n, n),即只要你走到finish那你一定横着走了n步或者竖着走了m步,就是一个组合问题了。二维动态规划public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; for(int i原创 2015-01-24 09:04:25 · 282 阅读 · 0 评论 -
Longest Palindromic Substring leetcode java
判断是不是palindromic是O(N)的,这个应该没有办法提高了,只能一个一个比较,如果是数字的话可以看reverse integer 那道题的O(1)的解法。要记录最长回文,多种方法可供选择,先看naive的方法,用一个StringBuiler来存,每当发现一个更长的,就更新。之前提到的,substring在jdk7以上是O(N)的,所以这naive 的方法是O(N*N*N)原创 2015-01-26 03:53:48 · 399 阅读 · 0 评论 -
Majority Element
好题,利用一个voting algorithm , O(N)时间+O(1)内存就可以做出来了。或者Arrays.sort(num) 然后 num[ num.length / 2 ] 就是那个元素了,因为数量多过n / 2嘛,哈哈,这样时间复杂度是O(NlogN),不需要额外内存空间。按理来说这道题可以推广到第K多的element,就比较复杂了。。可能需要先排序,再对每一个初次遇到的元素建cou原创 2015-01-25 08:25:39 · 329 阅读 · 0 评论 -
Anagrams
可耻的照抄code,没想出来。public ArrayList anagrams(String[] strs) { ArrayList res = new ArrayList(); if(strs == null || strs.length == 0) return res; HashMap> map转载 2015-02-13 11:00:32 · 315 阅读 · 0 评论 -
implement strStr()
implement strStr()这就是第一次online coding遇到的题,竟然是leetcode原题,还是easy,偏偏一直没写过==,真该掌嘴。思路简单,从0开始扫0+needle.length()的haystack的substring,match就return index,找不到就返回-1。 需要注意两个String “” 和 “” 要返回0。public int strSt原创 2015-01-23 11:09:20 · 319 阅读 · 0 评论 -
Valid Parentheses
用stack依次装入left, 遇到right就查看和之前存的left是不是match,match就pop(), 不match直接return false。可以用case 也可以用if来选择right。public boolean isValid(String s) { if(s == null || s.length() == 1) return false;原创 2015-01-26 12:35:04 · 287 阅读 · 0 评论 -
Add Two Numbers
不难,但是要注意carry最后如果不是零,一定要再new一个ListNode,第一次写的时候 我让ans.val = dig % 10 然后ans.next = new ListNode(0) 这明显不对,我们的答案就多了一个0,可以讨论 l1.next l2.next 不为null时候 去 new ans.next, 但是实现起来不如这个直接。public ListNode addTwoNu原创 2015-01-24 13:44:59 · 290 阅读 · 0 评论 -
Triangle
一上来看着道题好像很像二叉树求sum,会想到递归的方法,但是用动态规划更加节省内存和时间。top-down, bottom-up 两种思路里面,bottom-up更好写,好想,因为从下往上是收敛的,不是最小直接丢弃,所以加到第一行只剩下一个值就是答案。从上往下就要都存起来了,最后剩下n个数遍历一边找到最小值。从下往上的方法public int minimumTotal(Li原创 2015-01-25 03:31:44 · 454 阅读 · 0 评论 -
Reverse Integer
利用mod求最后一位,不断更新x, 直到x==0跳出循环。ret 先用double型保存以免溢出,这题要求溢出return 0. 还可以在ret每次更新前查看它的绝对值是不是比max/10大, 这样只需要一个int 型ret.public int reverse(int x) { double ret = 0; while( x!= 0 ) {原创 2015-01-25 05:37:41 · 275 阅读 · 0 评论 -
Min Stack
不多说,两个stack做出来,一个是正常的stack一个是用来记录min 的stack,我看了一下用一个stack的解法,只能给跪了,我是想不到的。class MinStack { public Stack stack = new Stack(); public Stack minStack = new Stack(); public void push(原创 2015-01-25 08:44:39 · 316 阅读 · 0 评论 -
String to Integer (atoi)
这题就老实看出错然后调整吧。。反正一开始我是没预料到带trail的情况。。直接trim()掉所有前后的空格。 test case里面有一个"+-2"的case要当心,但是似乎没有“011”这样的带‘0’的情况,我把这个情况也机智地写进了code。但是有时候聪明反被聪明误,比如为了应付"1a2"这种情况我还加了 if(i != str.length()) return 0; 在 while lo原创 2015-01-24 14:24:55 · 408 阅读 · 0 评论 -
Palindrome Number
有几种方法,这种最快public boolean isPalindrome(int x) { if(x < 0) return false; int palindromeX = 0; int input = x; while(input>0){ palindromeX = palindromeX*10原创 2015-01-25 09:30:28 · 341 阅读 · 0 评论 -
Search Insertion Position
之前第一次写的方法是O(n)的,回来再看,发现很明显是一道O(logN) 的二分查找题目,果断重新写。要判断target在array中的位置或者插入位置,那么就A[mid]和target 比较,发现A[mid] == target则返回mid,当start 和end 相遇的时候跳出循环。这时候有三种情况,找到了,那么return start = end都一样; A[start] 比较大,说明tar原创 2015-01-24 06:49:43 · 345 阅读 · 0 评论 -
Leetcode One by One----Two Sum
重新开始慢慢总结leetcode之前做过的题,好好写清思路。Two Sum 是第一题,第一次想到的是暴力枚举的O(N*N) 的方法public class Solution { public int[] twoSum(int[] numbers, int target) { int[] ret = {0, 0}; if(numbers.length原创 2015-01-23 08:58:36 · 632 阅读 · 0 评论 -
Reverse Words in a String
这题其实挺坑的,要细致的了解split()这个函数public String reverseWords(String s) { if(s== null || s.length() == 0) return s; String[] str = s.split(" "); int strLen = str.length; int原创 2015-01-27 05:39:56 · 445 阅读 · 0 评论 -
Remove Duplicates from Sorted List
这题简单,但是我把if(cur.next != null && cur.val == cur.next.val 换成cur.val != cur.next.val 然后交换一下if-else内容就不对了。还是没明白把,等下再看看public ListNode deleteDuplicates(ListNode head) { ListNode prev = head;原创 2015-01-28 03:27:19 · 267 阅读 · 0 评论 -
Substring with Concatenation of All Words
解法速度有点慢,要1000ms 左右,OJ上有人java的答案只要300ms, 不知道大神是怎么写的。。思路是先把L存成一个HashMap,然后因为L里面word一样长,就可以去check S的substring,在位置 i 每次平移一个wordlength,检查这个word在不在map里,在的话就新建一个curMap再查i+wordLen 到 i + wordLen*2一直查下去,最后比较c原创 2015-01-31 03:11:14 · 329 阅读 · 0 评论 -
Best Time to Buy and Sell Stock
一道很好的题,career cup上有一道facebook的题和这个一模一样: Given an array, find the maximum difference between two array elements given the second element comes after the first. 解法是保存数组中发现的最小值,每发现当前的值比最小值大,再看这个差值和diff原创 2015-02-01 04:09:24 · 331 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
这是O(N)的方法,维护窗口的左边和右边,右边不断向左走,当发现这个窗口里面有重复的时候,我们移动左边到重复元素的下一个,跳过中间的字符,因为不会比现在的max更长,而且也始终包含重复的字符。走到无重复了,我们继续移动右边。所以,表面看上去有while loop嵌套在另一个while loop里面,但是我们不重复之前走过的位置,所以时间复杂度还是O(N)的。public int lengthO原创 2015-01-31 04:11:20 · 304 阅读 · 0 评论 -
Generate Parentheses
DFS方法解这道题,假设手中拿着n个'('和n个’)', 每次放下一个,手中剩余的left不能比right少,再recusion.public List generateParenthesis(int n) { List ret = new ArrayList(); //if(n == 0) return ret; gene原创 2015-02-01 03:46:40 · 275 阅读 · 0 评论 -
Best Time to Buy and Sell Stock II
非常straightforward的方法,只要后项比前向大,就把差值加进maxP。 public int maxProfit(int[] prices) { if(prices == null || prices.length == 0) return 0; int i = 0; int maxP = 0; while(i <原创 2015-02-01 04:47:34 · 279 阅读 · 0 评论 -
Best time to Buy and Sell Stock III
最多进行两次买卖股票,并且不能再卖出前继续买,所以两次交易必须是分布在2个区间内我们可以划分2个区间为[0,i]和[i,prices.length-1],注意这样就把原题转换成了和Best time to Buy and Sell Stock I 一样了,求两个区间上各自的最大值,最后加起来就是最大利润。那么为什么左和右区间可以有overlap的位置呢?因为没有规定不能在同一天卖完再买,所以这原创 2015-02-02 02:58:46 · 422 阅读 · 0 评论 -
Path Sum
直接贴答案不多说public boolean hasPathSum(TreeNode root, int sum) { if(root == null ) return false; if(root.val == sum && root.left == null && root.right == null) return true; else r原创 2015-02-03 11:45:17 · 375 阅读 · 0 评论 -
Validate Binary Search Tree
递归检查root.val是不是在两个bound之间,不在的话就是false了。注意不要用Integer.MAX_VALUE/MIN_VALUE和Double.MAX_VALUE/MIN_VALUE,会有corner case 的错误,Long是没有问题的。但是我也一直没找到为什么Double不行。public boolean isValidBST(TreeNode root) {原创 2015-02-04 03:51:40 · 313 阅读 · 0 评论 -
Longest Common Prefix
这道题首先google了一下prefix是什么,其实就是在一个String array里面找到从每一个String的index = 0开始最长的共同字符串。算是implement strStr()的变体和升级版吧。思路是,既然是所有String都共有的从0开始的字符串,那可以任意选取一个String作为起始ret,只要其余String不match 这个 ret, 就不断截断ret, 直到mat原创 2015-01-24 03:33:13 · 372 阅读 · 0 评论 -
Unique Paths II
和unique path一样的思路,注意初始化dp时候,只要第一行第一列出现过1那么这行这列之后都是0了, Java初始数据会直接全部赋值为零,所以跳出循环即可。走的时候也要风情况讨论,遇到障碍物,dp[i][j] = 0,没有障碍物才按照递推公式计算。这题应该没有办法内存优化了。public int uniquePathsWithObstacles(int[][] obstacleGri原创 2015-01-24 09:46:56 · 253 阅读 · 0 评论 -
Single Number
贴两种方法,一种是用HashMap,另一种用bit manipulation, 但是我觉得第二种方法是因为题意不严密,{2,2,4,4,4,4} 4也不是出现了两次,但是你用第二种方法就根本得不到答案的。test case没有测试这种情况,说明默认不是出现了两次的那个数只出现了一次。public int singleNumber(int[] A) { HashMap map原创 2015-01-25 10:01:13 · 295 阅读 · 0 评论