中等
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n)
时间复杂度内完成此题。
思路:
有无无法使用除法,那肯定是空间换时间了。
列出各个数的乘积
x1*x2*x3*x4
x1*x2*x3*x4
x1*x2*x3*x4
x1*x2*x3*x4
仔细想一下,是不是中间的数字都没了,那么思路来了,就是存储两边的累乘,在遍历一次,就搞定了,时间复杂度也是o(n)。
代码如下:
package com.codeking.lc;
import java.util.Arrays;
/**
* @author xiongjl
* @since 2023/8/6 12:17
*/
public class lc238 {
public static void main(String[] args) {
int[] ints = new lc238().productExceptSelf(new int[]{1, 2, 3, 4});
System.out.println(Arrays.toString(ints));
}
public int[] productExceptSelf(int[] nums) {
// 左右累乘,两个数组去记录
int[] left = new int[nums.length];
int[] right = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
// 初始化
left[i] = 1;
right[i] = 1;
}
// 左数组
for (int i = 1; i < nums.length; i++) {
left[i] = left[i - 1] * nums[i-1];
}
// 右数组
for (int i = nums.length - 2; i >= 0; i--) {
right[i] = right[i + 1] * nums[i+1];
}
int[] res = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
res[i] = left[i] * right[i];
}
return res;
}
}