LeetCode2
- HashMap
718. Maximun Length of Repeated Subarray
- 动态规划:
用lookUp[][]来记录,双层循环嵌套,保证每一种情况都考虑到。由于是连续的,所以不能用siegel的动归。
class Solution { public int findLength(int[] A, int[] B) { int[][] lookUp = new int[A.length+1][B.length+1]; int max = 0; for(int i = A.length-1; i >= 0; i--){ for(int j = B.length-1; j >= 0; j--){ if(A[i] == B[j]){ lookUp[i][j] = lookUp[i+1][j+1] + 1; } max = Math.max(lookUp[i][j], max); } } return max; } }
时间复杂度:O(M*N)
- Binary Search (超时)
穷举,将所有的x长度的string一一放入hash表然后用另一个string一一去匹配。新奇的是:使用二分法来进行查找。例如:1 2 3 4 5(true true true false false)二分法查找最后一个true对应的是多长的子string。
class Solution { public boolean check(int length, int[] A, int[] B) { Set<String> seen = new HashSet(); for (int i = 0; i + length <= A.length; ++i) { seen.add(Arrays.toString(Arrays.copyOfRange(A, i, i+length))); } for (int j = 0; j + length <= B.length; ++j) { if (seen.contains(Arrays.toString(Arrays.copyOfRange(B, j, j+length)))) { return true; } } return false; } public int findLength(int[] A, int[] B) { int lo = 0, hi = Math.min(A.length, B.length) + 1; while (lo < hi) { int mi = (lo + hi) / 2; if (check(mi, A, B)) lo = mi + 1; else hi = mi; } return lo - 1; } }
要学习的点: 1. Arrays.toString(Arrays.copyOfRange(A, i, i+length)) 这个两个方法。 Arrays 的静态方法。
2. 二分法的写法:
535. Encode an Decode TinyURL
- Using simple Counter
要学习的点:map.get( Integer.parseInt( shortUrl.replace("tinyurl.com..", "")));
- Variable-length Encoding
用一个getString()方法生成一个子串:
String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 把所有的character都可以作为组成成分。然后还是用int count记数字。
public String getString() { int c = count; StringBuilder sb = new StringBuilder();//用StringBuilder可用append while (c > 0) { c--; sb.append(chars.charAt(c % 62));//模62 除62 c /= 62; } return sb.toString(); }
- Using hashcode
public String encode(String longUrl) { map.put(longUrl.hashCode(), longUrl); return "http://tinyurl.com/" + longUrl.hashCode(); }
The number of URLs that can be encoded is limited by the range of int, since hashCode uses integer calculations.
- Using random number
要学些的点:
Random r = new Random();
Random number = r.nextInt(Integer.MAX_VALUE);
但是这个方法需要判断一个tabel里面是不是已经有这个key了。
138. Copy List with Random Pointer
这个题目考察的其实是随机指针的复制,对于原节点random指针所指向的节点,能够巧妙的找到新链表中的对应节点,使新新节点的random指针指向它。这里有一个巧妙的方法,可以迅速找到原节点所对应的新节点。下面以下面这个链表为例。
每个节点包含的信息为:
例子:“X"表示指针指向空
(1)复制给定链表中的每一个节点,将其插入到给定链表中原节点的后面。
(2)复制random节点。由于新节点就在原节点的后面,因此,依次检测给定链表中的每个节点,若random不为空,则将它的下一个节点(对应新节点)的random指针指向原节点random指针所指节点的下一个节点。
(3)将该链表差分成新、旧两个链表,返回新链表。
原链表:
新链表:
需要学习的:
1. 因为random指向的顺序是不一定的,所以不能一个个的copy。把新节点插入旧节点后,可以有效的找到random应该插入的地方。
2. 关于第四步拆分两个节点。
CopyHead用来指向copyList的头,用于返回。
copy和c分别用于指向新链表和旧链表需要链接的地方:
while(copy.next != null)
c.next = c.next.next;
c = c.next;
copy.next = copy.next.next;
copy = copy.next;