题目及测试
/*Product of Array Except Self
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
}*/
public class main {
public static void main(String[] args) {
int[][] testTable = {{1,2,3,4},{4,3,2,1},{1,2,3,9},{1,1,9,9},{9,9}};
for (int[] ito : testTable) {
test(ito);
}
}
private static void test(int[] ito) {
Solution solution = new Solution();
int[] rtn;
long begin = System.currentTimeMillis();
for (int i = 0; i < ito.length; i++) {
System.out.print(ito[i]+" ");
}//开始时打印数组
rtn = solution.productExceptSelf(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println();
System.out.println("rtn=" );
for (int i = 0; i < rtn.length; i++) {
System.out.print(rtn[i]+" ");
}//打印结果几数组
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(别人的)
要的结果就是每个数 左边的数的乘积*右边的数的乘积
建立数组res,首先第一个循环,p就是i的左边的数的乘积,res的每个值=p,就是i的左边的数的乘积。
然后下一个循环,q就是 i的右边的数(包括i)的乘积,然后res[i-1]=res[i-1]*q=左边的数的乘积*右边的数的乘积
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] res = new int[nums.length];
int p = 1, q = 1;
for (int i = 0; i < nums.length; i++) {
res[i] = p;
p *= nums[i];
}
for (int i = nums.length - 1; i > 0 ; i--) {
q *= nums[i];
res[i - 1] *= q;
}
return res;
}
}
解法2(成功,2ms,较快)
public class Solution {
public int[] productExceptSelf(int[] nums) {
int length=nums.length;
if(length==0){
return null;
}
int[] result=new int[length];
// result先填充i左边的乘积
result[0] = 1;
for(int i=1;i<length;i++){
result[i]=result[i-1] * nums[i - 1];
}
// nums变成i右边的乘积
int prev = nums[length - 1];
int temp = 0;
nums[length - 1] = 1;
for(int i=length - 2;i>=0;i--) {
temp = nums[i];
nums[i] = nums[i + 1] * prev;
prev = temp;
}
for(int i=0;i<length;i++) {
result[i] = nums[i] * result[i];
}
return result;
}
}