题目描述:
一开始看题目挺简单的,先遍历一遍数组得到所有的数乘积,之后循环分别除以当前位置的数得到结果。但是往下读题,不允许除法,所以这个方法pass(这种方法还有个问题就是乘积有可能溢出)。不让除法怎么办呢?凉凉。看了下官方的解题思路:数组相乘可以分解成左半边,当前,右半边三部分。要想得到本题答案,只需要用左半边乘右半边。
public class Solution {
public static void main(String[] args) {
int[] a={1,2,3,4};
int[] b = new Solution().productExceptSelf(a);
for (int i:b){
System.out.println(i);
}
}
public int[] productExceptSelf(int[] nums) {
int[] left=new int[nums.length];
int[] right=new int[nums.length];
int[] result=new int[nums.length];
left[0]=1;
right[nums.length-1]=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];//易出错
}
for (int i=0;i<nums.length;i++){
result[i]=left[i]*right[i];
}
return result;
}
}
日常:思路我都懂,编码我就废。自己编码时候最容易出错的地方就是循环得到左右两边的乘积数组。这里一定要自己纸笔写一下画一下,注意这两个数组和循环i的关系。
现在考虑下如何降低空间复杂度。首先我们可以用result输出结果数组来代替left或right数组,之后另一个数组能不能省下呢。答案是可以的。将另一个数组用一个数循环来得到并且直接乘到result数组上。
public class Solution {
public static void main(String[] args) {
int[] a={1,2,3,4};
int[] b = new Solution().productExceptSelf(a);
for (int i:b){
System.out.println(i);
}
}
public int[] productExceptSelf(int[] nums) {
int[] result=new int[nums.length];
int right=1;
result[0]=1;
for (int i=1;i<nums.length;i++){
result[i]=result[i-1]*nums[i-1];
}
for (int i=nums.length-1;i>=0;i--){
result [i]*=right;
right*=nums[i];
}
return result;
}
}