题目**:
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
请不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
这个题用暴力解决法(双重循环),很容易解决的,但是题目要求O(n)
时间复杂度。暴力法就不符合要求了。
咱们采用另一种解决方法(分组法):1、i左边的乘积L[i]=L[i-1]*nums[i-1](L[0]=1)
2、i右边的乘积R[i]=R[i+1]*nums[i+1](R[nums.length-1]=1)
3、answer[i]=L[i]*R[i];即可
直接上代码了:
1、自定义输入输出:
public class likou238 {
public static void main(String[] args) {
// 先输入数组
Scanner scanner = new Scanner(System.in);
String[] s = scanner.nextLine().split(" ");
int[] nums = new int[s.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(s[i]);
}
///这里是暴力法,但本题不合适//
// int[] res = new int[nums.length];
// for (int i = 0; i < nums.length; i++) {
// int sum = 1;
// for (int j = 0; j < nums.length; j++) {
// if (i != j) {
// sum *= nums[j];
// res[i] = sum;
// }
// }
// }
// System.out.println(Arrays.toString(res));
///
int[] answer = new int[nums.length];
int[] L = new int[nums.length];
int[] R = new int[nums.length];
L[0] = 1;
// 这里一定要注意i的起始值
for (int i = 1; i < nums.length; i++) {
L[i] = L[i - 1] * nums[i - 1];
}
R[nums.length - 1] = 1;
// //这里一定要注意i的起始值
for (int i = nums.length - 2; i >= 0; i--) {
R[i] = R[i + 1] * nums[i + 1];
}
for (int i = 0; i < nums.length; i++) {
answer[i] = R[i] * L[i];
}
System.out.println(Arrays.toString(answer));
}
}
2、力扣答案:
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] answer = new int[nums.length];
int[] L = new int[nums.length];
int[] R = new int[nums.length];
L[0] = 1;
for (int i = 1; i < nums.length; i++) {
L[i] = L[i - 1] * nums[i - 1];
}
R[nums.length - 1] = 1;
for (int i = nums.length - 2; i >= 0; i--) {
R[i] = R[i + 1] * nums[i + 1];
}
for (int i = 0; i < nums.length; i++) {
answer[i] = R[i] * L[i];
}
return answer;
}
}