Leetcode Freq 4,5

Leetcode Freq 4-5

标签(空格分隔): leetcode

目录

20141105:

1. word ladder

  • 为什么wordladder用linkedlist来保存distanct?为什么要在for loop加distance并enqueue?为什么!isEmpty的时候pop出来的distance就是对的。
    • a. ANS: 可以参考Algs Princeton的BFS正确性证明。每次wordQ 在enqueue的时候都是同样深度的。而且queue的pop(remove and return)保证了distance的正确性。
      eg:ab->aa的最短距离。虽然az的话。loop会把distanceQ+1. 但是不同的word话要pop distance。如果不同的话又返回到aa了。
    • b. 不过还是觉得不太对劲。如果运气不好一直网az,dz,zz方向走不就成了DFS了?而不是BFS(一层一层的走吗?).
      ANS:BFS是搜完距离1的继续搜距离2的。当全部搜完之后call distTo来输出start到end的最近距离。
  ab
 /   \
aa   az
         \
         dz
           \
           zz

20141103:

0. BFS

  • 联系看pseudocode来写java。比如Wiki page的BFS (link).
  • 还是学习一下regex方便些。因为Java的replaceall支持regex。而且今天在删除eclipse里面的空行也是用的regex: ^\s*\n

1. Word Ladder

  • 怎么想到本质一个graph的shortest path呢?
    • a. 先是看了yutianzuijin的csdn博客(link)他先是想到2d matrix 然后再想到graph的2种表示方法:
      • 一. adjacent matrix
      • 二.adjacent list. 然后就可以用graph的BFS来解决。但是时间复杂度又太大了,是O(m*dict_size). 其实可以做到O(26*m)
    • b. 鱼的(link)讲了可以用bi-directional BFS,也可以看作是夹逼方法和k-Sum问题类似。
    • c. n00tc0d3r比较详细的分析并给出不同解法。而且说了hashset/hashmap在Java和C++里面的区别:在Java中map快,在C++中set快。

20141102:

finish freq 5

1. set Matrix Zeros.

  • 这又是一道:达到目的可以改变方式。为了in place.
  • 必须要有2组set来记录行列为0的info。既然有matrix给我们。就可以改变它。为什么不用第一行列作为这个row/col set. 当然如果第一行列有zero怎么回忆起来呢?虽说inplace不能用additional set. 但是flag还是可以的。因为O(1)=in place。

2. Merge sorted array/list.

复习一下java里面的lnkedlist和指针了。

20141101:

1. Pow(x,n):

我看了n00tc的答案,他是用n>>1 和 n&1来代替除法和取余数。但是我直接把pow2的计算换成bit后答案就错了。为什么呐?我测试了一下>>1 跟 &1. 发现如果是正数当然没问题。但如果是负数则除法跟取模都会得到意外的答案。
1. I got yu shu: 1 vs 1
1. I got remainder: 1 vs 1
2. I got yu shu: -1 vs -2
2. I got remainder: -1 vs 1
注意到N00tc0d3r一开始就把指数n取了绝对值。

2. Validate BST

很好的题目。可以复习到recursion跟iteration的转化。其实traverse里面的迭代版本不好想。邓俊辉的教材分析得很详细。而且recursion里面的每个return只是结束当前的stack,从而可以继续之前保存的stack。觉得CMU-ebiz的答案最好懂。这里面的lastVisit = root.val放到if(root.val<=lastVisit)之后。这个顺序也是一个高潮。要真正理解recursion才能想出来这点。

3. kd-Tree.

  • 参见Coursera Algo4th 的作业五:在一堆点里面找能用一个unit square抱住的点群。这就需要用2d tree来search了。link

4. Palindrome

  • 做palindrome之前先看一下java的replaceall用的regex: link
  • 这里要了解的就是[^a-z], [a-z0-3]的意思。前者是除了a到z以外。后者表示a到z和0到3.所以这里就是先把输入的string的非字母数字的字符都换成”“。

5. Valid Number

  • 居然说Valid Number是难度2的题目。。。跪了。第一次面试做compiler的parser就是一个automa。然后不会写Java的状态机。这次一定要搞懂。记得moore和mooley FSM最难的就是设计states。就连最简单的判断100101都容易写错。可以参考这个link看看这个状态图是怎么画的。N00tc0d3r只给了图….
  • 注意switch case的格式:要在每个case最后加break或者return。而且case只能是每一个值而不能给范围。所以a-zA-Z0-9就呆了。还是if else好用些。

6. setMatrixZeros

  • 做setMatrixZeros看到用的hashset,为什么呢?hashmap不行吗?为什么用Set<Integer> rows = new HashSet<Integer>();
    然后看到了一片总结:link。
    可以看看我在CS108里面贴的那个java collection framework关系图。
    注意在jdk里面set.class和hashset.class. 前者是interface后者是implementation。

20141030:

0. climb chairs

这题和数硬币组合类似。不过前者是permutation后者为combination。

1. 2 sum:

首先把题意搞清楚:
输入是一组未排序的可重复数组,以及一个目标数。且一组数组只有一组解。求这两个数的index。

ANS:
一开始想是:

for i: array
     for: j: rest of array
          if (i+j==target)
               return.

但是这样就会得到O(n^2)!

记得quick sort之类的排序算法是O(nlgn)。可以得到吗。
唉。想不出来。
看网上答案也就n00tc03r和lexi女的博客有思路分析。还有CMU-ebiz的java整个打包但是答案质量一般。不过也可以看看。programcreek的也很好。

但最主要还是像段公子说的那样要总结分析出pattern而不是一题一题的解决。这样永远会有不会做“新题”的可能。

比如这里面一般C++的都会用头尾指针,如CMU的做法。这里有个分析点很重要:首位指针如果大于target则可以把大的元素永远排除!也很容易想:因为这个最大的数加上最小的那个数都超了,那他就不可能和任意其他元素相加得到target。但是小的那个数却可以保留。因为他还有机会。这里和merge 2个排好序的数组要从最后排起。以及删除一个linked list的node却只给了前一个pointer一样。要脑子拐过弯!

所以先写第二种解法:头尾指针往中间靠。这样的时间复杂度是多少呢?
仔细看一下。CC里面的2sum是return 满足条件的2个element的值。所以可以用java的sort。
但因为leetcode是要求index。所以要多一个O(N)空间复杂度来保存index。
九章和CMU_ebiz都给了这个答案。

第三种解法:用hashmap。则可以O(1)+O(n)=O(n)
一个for loop, 搜索map里面有没满足的数,途中把target-input[i] 放到map里面。
这个最好。用到了java的library。又快又方便啊!而且HashTable解决所有搜索问题啊。

2. 3 sum:

还是要把题目理解:
找到一组未排序的可重复数组里面的所有 不重复的满足sum为0的triplets。
艹,搞了一上午,为什么Java ArrayList

3. 3 sum closest

4. 4 sum

5. k-sum.

6.pow(x,n):

先是naive做法。直接循环。但是傻了,忘了负指数是取倒数了。
到了用naive的recursion做法,Programcreek是说:’a recursive solution can easily be written.’。。。好容易弄混。要好好分类。其实就3类,先按N的奇偶正负分,同时和x的正负。而且记住是recursion,所以三个case都是互相调用,每次调用都是pow*pow*pow!而不是pow一次。
但是naive的recursion还是不够快,而且recursion的重复计算总是不好的。


ID
27Remove Element14
13Roman to Integer24
24Swap Nodes in Pairs24
67Add Binary24
129Sum Root to Leaf Numbers24
2Add Two Numbers34
12Integer to Roman34
22Generate Parentheses34
23Merge k Sorted Lists34
46Permutations34
49Anagrams34
77Combinations34
78Subsets34
79Word Search34
91Decode Ways34
102Binary Tree Level Order Traversal34
131Palindrome Partitioning34
69Sqrt(x)44
1Two Sum25
8String to Integer (atoi)25
20Valid Parentheses25
21Merge Two Sorted Lists25
65Valid Number25
70Climbing Stairs25
88Merge Sorted Array25
125Valid Palindrome25
153Sum35
50Pow(x, n)35
73Set Matrix Zeroes35
98Validate Binary Search Tree35
127Word Ladder35
28Implement strStr()45
56Merge Intervals45
57Insert Interval45
ID念念不忘, 必有回响
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值