日拱一卒


1 一周见闻

1.1 技术文章

1.2 泛互联网文章

2 技术总结

3 Algorithm(算法题)


class Solution {
    public int[] productExceptSelf(int[] nums) {
        // 使用两个数组,分别保存当前元素的左乘积和右乘积
        int n = nums.length;
        int[] left = new int[n];
        int[] right = new int[n];
        left[0] = 1;
        for(int i = 1; i < n; i++) {
            left[i] = left[i - 1] * nums[i - 1];
        }
        right[n - 1] = 1;
        for(int j = n - 2; j >= 0; j--) {
            right[j] = right[j + 1] * nums[j + 1];
        }
        for(int i = 0; i < n; i++) {
            nums[i] = left[i] * right[i];
        }
        return nums;
    }
}

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        // 如果从 x 到 y 无法到达,那么从 x 与 y 间任何一个加油站出发都无法到达 y。
        // 题目保证如果有解则必为唯一解
        
        int n = gas.length;
        int sum = 0;
        for(int i = 0; i < n; i++) {
            sum += (gas[i] - cost[i]); 
        }
        if(sum < 0) {
            return -1;
        }

        // 必定有解
        sum = 0;
        int i = 0;
        int from = 0;
        while(i < n){
            sum += (gas[i] - cost[i]);
            if(sum < 0) {
                from = i + 1;
                i = i + 1;
                sum = 0;
            } else {
                i++;
            }
        }
        return from;

    }
}