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;

 

posted @ 2017-11-17 05:00  nina阿瑶  阅读(162)  评论(0编辑  收藏  举报