算法 - 除自身以外数组的乘积

题目:

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

分析:
本来最简单的做法是遍历一遍数组,拿到总乘积,然后再遍历一遍,用除法就搞定了。这种方式最简单也最有效,但是题目偏偏不让。

按照最暴力的解法,遍历数组拿到当前的数后,再去遍历数组里其余的数,一个一个乘积得到结果。但是这样太暴力了,时间复杂度太高 ,O(n*n)

所以需要思考如何其他解法?

如上面的数组,如果遍历到3的时候,我们知道的是3之前的乘积,但是3之后的乘积是不清楚的。
所以如果知道了3之后的乘积,就能把一切问题解决了。
3之后的乘积如何获取?貌似我们可以倒序遍历一次,就可以知道了。

为了减少如暴力法的多次循环,可以先倒序遍历一次,用表存下来后面所有的乘积。

代码如下:

class Solution:
        
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        tempDic,index,afterNum = {},1,1
        tempDic[0] = 1
# 倒序获取剩余部分的乘积,存入字典里
# 字典存的是剩余几个的乘积。比如tempDic[2] = 10,就代表数组右边剩余2个元素的乘积。
        for num in reversed(nums):
            afterNum *= num
            tempDic[index] = afterNum
            index +=1
        result,afterNum,totalLen = [],1,len(nums)
# 正序遍历,用afterNum存左边的乘积,从字典里拿右边的乘积。相乘获取结果存入数组
        for currentIndex in range(totalLen):
            result.append(afterNum*tempDic[totalLen-currentIndex-1])
            afterNum *= nums[currentIndex]
        return result
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 8,183评论 0 1
  • 数组 记录《剑指offer》中所有关于数组的题目,以及LeetCode中的相似题目 相关题目列表 说明 由于简书...
    wenmingxing阅读 5,404评论 1 12
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 5,902评论 0 2
  • 1 寻找最大的k个数 输入包含n个整数的数组,输出其中最大的k个数。要求:输出的数字不能重复,如果k大于可输出数字...
    敲代码的密斯想阅读 5,004评论 0 2
  • 曾经我家也养过狗。 最早养的一只狗叫欢欢,欢欢这个名字是我从一本作文选里看到的就给它用了,这是一只矮矮胖...
    liuliu595阅读 2,924评论 2 4

友情链接更多精彩内容