作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
欢迎 点赞✍评论⭐收藏
算法领域知识
链接 | 专栏 |
---|---|
分发糖果 | 算法专栏 |
买卖股票的最佳时机 | 算法专栏 |
跳跃游戏 | 算法专栏 |
H 指数 | 算法专栏 |
除自身以外数组的乘积 | 算法专栏 |
经典算法题 之
除自身以外数组的乘积
题目如下:
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法, 且在 O(
n
)
时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4] 输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
提示:
2 <= nums.length <= 10
5-30 <= nums[i] <= 30
nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内实现逻辑:
为了在O(n)时间复杂度内完成,可以使用两个额外的数组left和right来分别保存每个元素i左侧的乘积和右侧的乘积。然后,使用两个循环遍历数组,计算出left[i]和right[i]的值。最后,再遍历一次数组,根据left[i]和right[i]的值计算出answer[i]的结果。
具体实现逻辑如下:
Java代码实现:
public class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] left = new int[n];
int[] right = new int[n];
left[0] = 1;
for (int i = 1; i < n; i++) {
left[i] = left[i-1] * nums[i-1];
}
right[n-1] = 1;
for (int i = n-2; i >= 0; i--) {
right[i] = right[i+1] * nums[i+1];
}
int[] answer = new int[n];
for (int i = 0; i < n; i++) {
answer[i] = left[i] * right[i];
}
return answer;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1, 2, 3, 4};
int[] answer = solution.productExceptSelf(nums);
System.out.println("Answer: ");
for (int i = 0; i < answer.length; i++) {
System.out.print(answer[i] + " ");
}
}
}
执行过程:
以输入数组nums = [1, 2, 3, 4]
为例,按照以上算法实现,执行步骤如下:
left = [1, 0, 0, 0]
,right = [0, 0, 0, 1]
,answer = [0, 0, 0, 0]
。left
数组,得到left = [1, 1, 2, 6]
。right
数组,得到right = [24, 12, 4, 1]
。answer
数组,得到answer = [24, 12, 8, 6]
。Answer: 24 12 8 6
。关注作者,普修罗双战士,给你不一样的技术体验,一起在技术领域扶摇直上九万里,共筑坚如磐石的权。
欢迎 点赞✍评论⭐收藏