问题描述:
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
样例:
要求:
思路分析:
(1)暴力破解
二次循环直接解决,可是有时间复杂度的限制,故不可。
{2)前后缀积
典型的空间换时间,建立两个数组,一个记录前面的乘积,另一个记录后面的乘积。
代码见下:
package Leetcode;
import java.util.Arrays;
import java.util.Scanner;
public class Czswcj {
//给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,
// 其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
public static int[] productExceptSelf(int[] nums) {
int []pre=new int[nums.length];
pre[0]=nums[0];
int []next=new int[nums.length];
next[nums.length-1]=nums[nums.length-1];
int []out=new int[nums.length];
for (int i = 1; i <nums.length; i++) {
pre[i]=pre[i-1]*nums[i];
}
for (int i = nums.length-2; i >=0 ; i--) {
next[i]=next[i+1]*nums[i];
}
for (int i = 0; i <out.length ; i++) {
if (i==0)
out[i]=next[i+1];
else if (i==out.length-1)
out[i]=pre[i-1];
else
out[i]=next[i+1]*pre[i-1];
}
return out;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int len=scanner.nextInt();
int []nums=new int[len];
for (int i = 0; i <len ; i++) {
nums[i]=scanner.nextInt();
}
int []out=productExceptSelf(nums);
System.out.println(Arrays.toString(out));
}
}
运行结果: