数组与矩阵---不包含本位置值的累乘数组
来源:互联网 发布:split赋值给数组 编辑:程序博客网 时间:2024/06/06 04:37
【题目】
给定一个整型数组arr,返回不包含本位置值的累乘数组。
例如,arr = [2, 3, 4, 1],返回[12, 8, 24, 6],即除自己以外,其他位置上的累乘。
【要求】
- 时间复杂度O(N)
- 除需要返回的结果数组外,额外空间复杂度O(1)。
【基本思路】
方法一。使用除法进行实现。所有数的累积记为all,如果数组中不存在0,那么结果数组中每一个位置的值为 all/arr[i];如果数组中存在一个0,那么除该位置的值为all,其余都是0;如果有两个或者两个以上的0,结果数组全为0。
下面是使用python3.5实现的代码。
def product1(arr): if arr == None or len(arr) < 2: return all = 1 count = 0 for i in range(len(arr)): if arr[i] == 0: count += 1 else: all *= arr[i] if count == 0: return [all // arr[i] for i in range(len(arr))] res = [0 for i in range(len(arr))] if count == 1: for i in range(len(arr)): if arr[i] == 0: res[i] = all break return res
方法二。不使用除法进行实现。分别使用辅助两个数组left和right,其中left表示数组从左到右的累乘结果(即left[i] = arr[0…i]的累乘);相反,right表示数组从右到左的累乘结果。那么对于结果数组res,res[i] = left[i-1] * right[i+1]。
实际上,并不需要额外声明两个辅助数组。可以复用结果数组res,即先将res当辅助数组用,再把res调整为结果数组即可。具体实现见如下代码:
def product2(arr): if arr == None or len(arr) < 2: return res = [0 for i in range(len(arr))] res[0] = arr[0] for i in range(1, len(res)): res[i] = res[i-1] * arr[i] tmp = 1 for i in range(len(arr)-1, 0, -1): res[i] = res[i-1] * tmp tmp *= arr[i] res[0] = tmp return res
阅读全文
2 0
- 数组与矩阵---不包含本位置值的累乘数组
- 数组与矩阵---数组中子数组的最大累乘积
- 数组与矩阵---在数组中找到一个局部最小的位置
- C#数组之间的比较获取某个数组不包含有另一个数组的值
- 数组与矩阵---自然数组的排序
- 数组与矩阵---数组的partiton调整
- 数组与矩阵的区别
- 矩阵的点乘与叉乘
- 字典与数组的相互包含
- 数组与矩阵---不重复打印排序数组中相加和为给定值的所有二元组和三元组
- matlab 数组与矩阵
- C#数组与矩阵
- 数组与矩阵
- Matlab数组与矩阵
- NumPy矩阵与数组的区别
- 数组与矩阵的区别 Python
- 数组与矩阵---需要排序的最短子数组长度
- 数组与矩阵---最长可整合子数组的长度
- SCUT Training 20170920 Problem E
- 【HDU3586】Information Disturbing-二分答案+树形DP
- c#中接口和类的有什么异同,c#中的委托是什么?事件是不是一种委托?事件和委托的关系
- LWC 50:679. 24 Game
- JavaScript函数,递归
- 数组与矩阵---不包含本位置值的累乘数组
- Gym
- ACM-9月21日周四周中训练心得
- Android中对话框Dialog的创建
- 线段树------贴海报
- 392. Is Subsequence (greedy)
- jQuery单选框的回显
- 关于ehcache配置文件
- Apache的BeanUtils组件学习