显示标签为“facebook interview”的博文。显示所有博文
显示标签为“facebook interview”的博文。显示所有博文

2013年4月1日星期一

3 sum

3 sum

First, 2 sum is needed.

/** first sort, then search target
 *  actually, the problem is as the same as search a target in Young matrix
 *  Notice: repeated number
 */

public class Solution {
    private ArrayList<ArrayList<Integer>> twoSum(int[] num, int startIndex, int target) {
        ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
        int low = startIndex;
        int high = num.length - 1;
        while (low < high) {
            int sum = num[low] + num[high];
            if (sum < target) {
                while (++low < high && num[low] == num[low - 1]);
            } else if (sum > target) {
                while (--high > low && num[high] == num[high + 1]);
            } else {
                ArrayList<Integer> pair = new ArrayList<Integer>();
                pair.add(num[low]);
                pair.add(num[high]);
                rst.add(pair);
                while (++low < high && num[low] == num[low - 1]);
                while (--high > low && num[high] == num[high + 1]);
            }
        }
        return rst;
    }
    
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
        Arrays.sort(num);
        for (int i = 0; i < num.length - 2;) {
            ArrayList<ArrayList<Integer>> twoSum = twoSum(num, i + 1, -num[i]);
            for (ArrayList<Integer> pair : twoSum) {
                pair.add(0, num[i]);
                rst.add(pair);
            }
            while (++i < num.length - 2 && num[i] == num[i - 1]);
        }
        return rst;
    }
}

sqrt

sqrt


Babylonian method for square root


why (x + y)/2 is always bigger than square root of n:

public double sqrt(double n) {
    double x = n;
    double y = 1;
    double e = 0.0001
    while (x - y > e) {
        x = x + (y - x) / 2;
        y = n / x;
    }
    return x;
}