题目:
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
思路及方法:
- 计算每个元素左边所有元素的乘积:
- 创建一个新的数组
left
。left
设置为 1,因为第一个元素左边没有其他元素。- 然后从第二个元素开始遍历,
left[i] = left[i-1] * nums[i-1]
。这样就可以计算出每个元素左边所有元素的乘积。- 计算每个元素右边所有元素的乘积:
- 创建另一个新的数组
right
。right[n-1]
设置为 1,因为最后一个元素右边没有其他元素。- 然后从倒数第二个元素开始遍历,
right[i] = right[i+1] * nums[i+1]
。这样就可以计算出每个元素右边所有元素的乘积。- 计算最终结果:
- 创建一个新的数组
answer
。- 对于每个下标
i
,我们将left[i]
和right[i]
相乘,得到answer[i]
。这样就可以得到最终的结果数组。
import java.util.Arrays;
public class no_238 {
public static void main(String[] args) {
int[] arr = {1,2,3,4};
int[] ints = productExceptSelf(arr);
System.out.println(Arrays.toString(ints));
}
public static int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] left = new int[n];
int[] right = new int[n];
int[] ans = 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 i = n - 2; i >= 0; i--) {
right[i] = right[i + 1] * nums[i + 1];
}
for (int i = 0; i < n; i++) {
ans[i] = left[i] * right[i];
}
return ans;
}
}