Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].
Solve it without division and in O(n).数组
For example, given [1,2,3,4], return [24,12,8,6].spa
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)指针
有三种状况:
数组元素不含0,像[1,2,3,4], return [24,12,8,6]
数组元素有1个0,[1,0,3,4], return [0,12,0,0],是0的那个位置是其余元素的乘积
数组元素有2个或者2个以上0,[1,0,0,4]则返回[0,0,0,0],返回所有是0.code
public class ProductArrayExceptSelf { public int[] solution(int[] nums) { int zeroCount = 0; for (int n : nums) if (n == 0) zeroCount++; // 有两个或者两个以上的元素是0,那么数组设为全零返回 if (zeroCount > 1) { for (int i = 0; i < nums.length; i++) nums[i] = 0; } else if (zeroCount == 0) { // 若是没有0,则计算全部的乘积 int product = 1; for (int n : nums) product *= n; // 每一个数组元素置为product / 该位置值便可 for (int i = 0; i < nums.length; i++) nums[i] = product / nums[i]; } else { // 若是元素中有1个0 int product = 1; // 跳过那个元素,计算全部的乘积 for (int n : nums) if (n != 0) product *= n; // 元素为0的位置置为product,其余置为0 for (int i = 0; i < nums.length; i++) if (nums[i] == 0) nums[i] = product; else nums[i] = 0; } return nums; } public static void main(String[] args) { System.out.println(Arrays.toString(new ProductArrayExceptSelf().solution(new int[] { 1, 0, 3, 0 }))); } }
补上one pass 且不用除法, o(n)解法。
使用左右指针,一遍遍历便可element
public int[] solution2(int[] nums) { int[] result = new int[nums.length]; Arrays.fill(result, 1); int left = 1, right = 1; int len = nums.length; for (int i = 0; i < len; i++) { result[i] *= left; result[len - 1 - i] *= right; left *= nums[i]; right *= nums[len - i - 1]; //System.out.println(Arrays.toString(result)); } return result; }