题目:
已知一个包含N个元素的数组A[N],试求出这样一个数组OUTPUT[N],其中OUTPUT[I]的值为数组A中除了A[i]的其他所有元素的乘积。注意,不能使用除法。时间复杂度必须为O(N)。
例如OUTPUT[0]的值为A[1]*A[2]...A[N], OUTPUT[1]的值为A[0]*A[2]...A[N]。
假定数组A={4, 3, 2, 1, 2},则OUTPUT={12, 16, 24, 48, 24}。
分析:
初看此题,觉得很无聊,这个题目貌似没有什么意义。要是可以用除法,直接OUTPUT[I]=A[0]*A[1]...A[N]/A[i]。
但是不能用除法,而且时间复杂度为O(N),确实一时还难以想到好的解法。如果使用暴力方法,每次求OUTPUT[I]都暴力计算一遍,那么时间复杂度为O(N^2),达不到O(N)的要求。
我们可以定义一个数组B,其中元素B[i]的值为A[0]到A[i]的乘积,即B[i]=A[0]*A[1]...A[i]。假如A = {4, 3, 2, 1, 2},则B = {4, 12, 24, 24, 48}。然后从右向左扫描数组A,并使用一个变量product记录从右向左扫描到当前位置的乘积。从而OUTPUT[i]=B[i-1]*product.
上面的方法采用O(N)的时间和O(N)的空间,那么是否还有更好的办法呢?是否能省去这O(N)的空间呢?
确实是的,这O(N)的空间确实可以省去。我们使用2个变量就可以满足要求。使用变量left保存从左向右扫描数组A的乘积,使用变量right保存从右向左扫描数组A的乘积。
代码:
void array_multiplication(int A[], int OUTPUT[], int n)
{
int left = 1;
int right = 1;
for (int i = 0; i < n; i++)
OUTPUT[i] = 1;
for (int i = 0; i < n; i++) {
OUTPUT[i] *= left;
OUTPUT[n - 1 - i] *= right;
left *= A[i];
right *= A[n - 1 - i];
}
}
分享到:
相关推荐
最新腾讯PHP面试题1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除不需要的对象。 PHP 使用了引用计数 (reference counting) GC 机制。 每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,...
腾讯Java面试题
腾讯面试题 前端面试题 腾讯的前端面试题。
腾讯php面试题解析
腾讯java面试题 2013年腾讯java笔记题,
10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题
在这里汇总了腾讯历年的笔试面试题,希望对和我一样正在找工作的朋友一点帮助
企业-腾讯校招面试题真题(20题)-新增
腾讯面试题解析,android面试题,2020年面试题,网络基础,常用三方库,算法基础等等的。腾讯面试题解析,android面试题,2020年面试题,网络基础,常用三方库,算法基础等等的
腾讯Java面试题(内容概要): 这份腾讯Java面试题汇总了腾讯一线技术面试中经常出现的题目,涵盖了Java基础、多线程、集合类、网络编程、JVM调优、Spring框架、分布式系统等多个方面。通过这份面试题,可以帮助...
汇总的腾讯的笔试面试题,还包括了实习招聘等。
主要是华为 腾讯的面试题 和一些面试技巧
腾讯系统工程师面试题 腾讯系统工程师面试题 腾讯系统工程师面试题
2009腾讯社招面试题,范围比较宽,希望对大家有用。
2022年最新(腾讯)前端面试题真题解析,希望对你面试有帮助,加油
阿里面试20题 百度面试10题 华为面试10题 京东面试13题 腾讯面试37题 头条面试10题 项目经理面试常遇问题 经典面试题 程序员 IT经理 项目经理 面试题 研发经理 高级程序员 经典面试题
腾讯近年来笔试面试题合集 包括校园招聘与实习生招聘 主要是技术类
C++面试题笔试题 C语言 IQ智力面试题笔试题 JAVA笔试面试资料 NET面试题笔试题 web开发 数据库面试题笔试题 算法 数据结构 计算机基础 计算机网络 软件测试 ava工程师面试题大全-100%公司笔试题你都能碰到几个.docx ...
(腾讯)后台开发面试题解答
腾讯后台开发面试题及答案 2016年02月25日 18:09:10 kmcfly 阅读数:4972更多 个人分类: private 简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件...