题目描述(困难难度)
返回一个数组,第 个位置存储原数组除了第 i
个数以外的所有数的乘积。
解法一
最直接的想法就是先把所有的数乘起来,然后对于需要返回的数组的第 i
个位置,只需要将所有数的累乘结果除以第 i
个数即可。
如果所有数的累乘结果记为 mul
,返回的数组用 res
存储,原数组用 nums
存储,那么
res[i] = mul / nums[i]
。
除法的话需要考虑除零的问题,如果 nums
中有一个 0
,那么 除了 0
的那个位置的结果是其余数累乘,其余位置的结果就都是 0
了。
如果 nums
中 0
的个数超过一个,那么 res
所有结果就都是 0
了。
当然了题目中说不能用除法,恰巧在 我们用加减法实现过除法,这里的话就可以直接调用了。
解法二
只要看到这张图,应该就明白算法了。
白色部分表示当前准备求解的位置,其结果就是粉色部分数字的累乘再乘上黄色部分数字的累乘。换句话说,其实就是左右两部分的累乘结果再相乘
所以我们只需要把所有粉色结果和黄色结果提前保存起来,然后可以直接去计算结果了。
假设数组个数是 n
。
我们用 left[i]
存储下标是 0 ~ i - 1
的数累乘的结果。
用 存储下标是 i + 1 ~ n - 1
的数累乘的结果。
至于边界情况,我们把 left[0]
和 right[n - 1]
初始化为 1
即可。
当然,我们可以省去 left
和 right
数组,先用 res
存储 left
数组的结果,然后边更新 ,边和 res
相乘。
总
解法二应该是出题人的意思,关键就是认识到那个图,有种分类的意思,把其余的数分成了左半部分和右半部分。解法一的话有种作弊的感觉,哈哈。
添加好友一起进步~
如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^
如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 查看详情