本题特点
- 一开始使用双循环,果不其然超时。
- 想到除自身外的元素,区别算出在当前元素之前的元素乘积,在当前元素之后的乘积,再将两者相乘
- 思路类似 前缀和,前缀和是包括当前元素的 ,此题要求不包含当前元素
- 所以求前缀积不包含当前元素,要先赋值,再乘积,将乘积值挪给下一个元素
本题思路
- 求出当前元素之前的元素的积
- 求出在当前元素之后的元素的积
- 将当前元素之前的元素积和当前元素之后的积相乘,得到就是除元素
python
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
answer = [1] * len(nums)
pre = 1
suf = 1
# 求出在当前元素之前的元素的积
for i in range(len(nums)):
answer[i] = pre
pre *= nums[i]
for j in range(len(nums)-1, -1, -1):
# 将当前元素之前的元素积和当前元素之后的积相乘,得到就是除元素
answer[j] *= suf
# 求出在当前元素之后的元素的积
suf *= nums[j]
return answer
java写法
java
package leetcode;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
/**
* File Description: ProductOfArrayExceptSelf_238
* Author:
* Date: 2025/4/28 10:40
*/
public class ProductOfArrayExceptSelf_238 {
public int[] productExceptSelf(int[] nums){
int[] answer = new int[nums.length];
Arrays.fill(answer, 1);
int pre = 1, suf = 1;
for(int i = 0; i < nums.length; i++){
answer[i] = pre;
pre *= nums[i];
}
for(int j = nums.length-1; j >= 0; j--){
answer[j] *= suf;
suf *= nums[j];
}
return answer;
}
@Test
public void TestProductExceptSelf(){
int[] nums = {1,2,3,4};
int[] answer = productExceptSelf(nums);
System.out.println(Arrays.toString(answer));
}
}