题目描述(困难难度)

    返回一个数组,第 个位置存储原数组除了第 i 个数以外的所有数的乘积。

    解法一

    最直接的想法就是先把所有的数乘起来,然后对于需要返回的数组的第 i 个位置,只需要将所有数的累乘结果除以第 i 个数即可。

    如果所有数的累乘结果记为 mul,返回的数组用 res 存储,原数组用 nums 存储,那么

    res[i] = mul / nums[i]

    除法的话需要考虑除零的问题,如果 nums 中有一个 0,那么 除了 0 的那个位置的结果是其余数累乘,其余位置的结果就都是 0 了。

    如果 nums0的个数超过一个,那么 res 所有结果就都是 0 了。

    当然了题目中说不能用除法,恰巧在 我们用加减法实现过除法,这里的话就可以直接调用了。

    解法二

    只要看到这张图,应该就明白算法了。

    白色部分表示当前准备求解的位置,其结果就是粉色部分数字的累乘再乘上黄色部分数字的累乘。换句话说,其实就是左右两部分的累乘结果再相乘

    所以我们只需要把所有粉色结果和黄色结果提前保存起来,然后可以直接去计算结果了。

    假设数组个数是 n

    我们用 left[i]存储下标是 0 ~ i - 1 的数累乘的结果。

    用 存储下标是 i + 1 ~ n - 1 的数累乘的结果。

    至于边界情况,我们把 left[0]right[n - 1]初始化为 1 即可。

    当然,我们可以省去 leftright 数组,先用 res 存储 left 数组的结果,然后边更新 ,边和 res 相乘。

    解法二应该是出题人的意思,关键就是认识到那个图,有种分类的意思,把其余的数分成了左半部分和右半部分。解法一的话有种作弊的感觉,哈哈。

    windliang wechat

    添加好友一起进步~

    如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

    如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 查看详情