public int maxProduct(int[] nums) {
        if (nums.length == 0)
            throw new RuntimeException();
        int globalMax = nums[0], localMax = nums[0], localMin = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            int tmpMin = localMin * nums[i];
            int tmpMax = localMax * nums[i];
            localMin = tmpMin < nums[i] ? tmpMin : nums[i];
            if (tmpMax < localMin)
                localMin = tmpMax;
            localMax = tmpMax > nums[i] ? tmpMax : nums[i];
            if (tmpMin > localMax)
                localMax = tmpMin;
            if (localMax > globalMax)
                globalMax = localMax;
        }
        return globalMax;
    }