力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给你一个整数数组
nums
,返回 数组answer
,其中answer[i]
等于nums
中除nums[i]
之外其余各元素的乘积 。题目数据 保证 数组
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在
O(n)
时间复杂度内完成此题。示例 1:
输入: nums = [1,2,3,4] 输出:[24,12,8,6]
示例 2: 输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
解题思路:双指针
定义乘积的前缀beforeMul和后缀afterMul,beforeMul代表从i=0开始,nums数组前面的乘积,afterMul代表从j=nums.length-1开始,nums数组后面乘积。
以nums = [1,2,3,4,5]数组为例,nums数组从0开始遍历到索引 i=3时此时ans[i=3] = nums[0]*nums[1]*nums[2],同时nums数组从尾部开始倒序j=3时,ans[j=3] = nums[4];
综合前序遍历和后序遍历可得到ans[3] = nums[0]*nums[1]*nums[2]*nums[4];
代码如下:
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
Arrays.fill(ans,1);
//维护两个变量,beforeMul表示前缀乘积,afterMul表示后缀乘积
int beforeMul = 1, afterMul = 1;
for(int i = 0,j= n-1;i