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].
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.
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)解法。
使用左右指针,一遍遍历即可
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。