除自身以外数组的乘积
这个题目关键在于计算两个方向的乘积,最简单方法就是创建两个数组存放L与R方向成积,但是会额外增加计算量,因为有些是不需要计算乘积(根据输出迭代判断),此时我们应该想的就是在输出时我们又进行了迭代,那么我们可以利用这个迭代,进行输出的同时另外去构建R方向的乘积,这样就可以通过条件判断减少运行时间,虽然没有减少时间复杂度。我就想到这个,但是没有想到将空间复杂度变为1,看了官方题解,我发现我竟然忘了可以将L方向乘积用输出数组替代,这真的是我的问题了,观察不仔细了。这里我没有优化空间,用的还是我的算法,具体可以看官方题解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public int[] productExceptSelf(int[] nums) { int m = nums.length; int [] num = new int[m]; // int [] n = new int[m]; int [] ms = new int[m]; for(int i =0; i< m;i++){ if(i !=0){ ms[i] = nums[i]*ms[i-1]; // n[m-1-i] = nums[m-1-i]*n[m-1-i+1]; }else{ ms[i] = nums[i]; // n[m-1-i] = nums[m-1-i]; } } for(int i = m-1;i>=0;i--){ if(i==m-1){ num[i] = ms[i-1]; }else if(i==0){ num[i] = nums[i+1]; }else{ nums[i] = nums[i]*nums[i+1]; num[i] = ms[i-1]*nums[i+1]; } } return num; } }
|