lintcode :数组剔除元素后的乘积
题目:
给定一个整数数组A。
定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。
给出A=[1, 2, 3],返回 B为[6, 3, 2]
解题:
leftb计算左侧的连乘值,每次增加一个成绩,rightb计算右侧的连乘值,每次重新计算,时间复杂度O(N2),下面写的程序,自我感觉很差的。。。
Java程序:
public class Solution {
/**
* @param A: Given an integers array A
* @return: A Long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
*/
public ArrayList<Long> productExcludeItself(ArrayList<Integer> A) {
// write your code
ArrayList<Long> B = new ArrayList<Long>();
long leftb = 1;
long rightb = 1;
for(int i = 0 ;i<A.size();i++){
if(i==0){
leftb = 1;
}else
leftb = leftb * A.get(i-1);
for(int j=i+1;j<A.size();j++){
rightb = rightb * A.get(j);
}
long bi = leftb * rightb;
B.add(bi);
rightb = 1; }
return B;
}
}
总耗时: 1602 ms
Python程序:
class Solution:
"""
@param A: Given an integers array A
@return: An integer array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
"""
def productExcludeItself(self, A):
# write your code here
leftb = 1
rightb = 1
B = []
for i in range(len(A)):
if i==0:
leftb = 1
else:
leftb *= A[i-1]
rightb = 1
for j in range((i+1),len(A)):
rightb *= A[j]
bi = leftb * rightb
B.append(bi)
return B
总耗时: 582 ms
左右分治,这个效率很高 ,减少了重复计算rightb。result[i] = left[i] * right[i] ,left[i] = A[0]*A[1]***A[i-1],right[i] = A[i+1]*A[i+2]***A[len(A)-1]。将最后的乘积分为两部分求解,首先求得左半部分的值,然后求得右半部分的值。最后将左右两半部分乘起来即为解。
时间复杂度 O(n). 使用了左右两半部分辅助空间,空间复杂度 O(2n).
注意:初值left[0] = 1.right[A.size()-1]=1
Java程序:
public class Solution {
/**
* @param A: Given an integers array A
* @return: A Long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
*/
public ArrayList<Long> productExcludeItself(ArrayList<Integer> A) {
// write your code ArrayList<Long> B = new ArrayList<Long>();
if(A==null || A.size()==1){
long bi = 1;
B.add(bi);
return B;
}
long[] left = new long[A.size()];
long[] right = new long[A.size()];
left[0] = 1;
for(int i=1;i<A.size();i++){
left[i] = left[i-1] * A.get(i-1);
}
right[A.size()-1] = 1;
for(int i=A.size()-2;i>=0;i--){
right[i] = right[i+1] * A.get(i+1);
}
for(int i=0;i<A.size();i++){
long res = right[i] * left[i];
B.add(res);
}
return B;
}
}
总耗时: 1873 ms
Python程序:
class Solution:
"""
@param A: Given an integers array A
@return: An integer array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
"""
def productExcludeItself(self, A):
# write your code here
if A==None or len(A)<=1:
B = [1]
return B
Alen = len(A)
left = [1]*Alen
right = [1]*Alen
B = []
for i in range(1,Alen):
left[i] = left[i-1] * A[i-1]
for i in range(Alen-2,-1,-1):
right[i] = right[i+1] * A[i+1]
for i in range(Alen):
res = right[i] * left[i]
B.append(res)
return B
总耗时: 475 ms
上面链接中还给只用定义一个数组的,中间定义一个变量,慢慢增加的。
lintcode :数组剔除元素后的乘积的更多相关文章
- LintCode-50.数组剔除元素后的乘积
数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出A=[1 ...
- lintcode50 数组剔除元素后的乘积
数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 您在真实的面试中是 ...
- LintCode_50 数组剔除元素后的乘积
题目 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出A=[1, 2, 3], ...
- C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
C#实现如何判断一个数组中是否有重复的元素 如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...
- php array_flip() 删除数组重复元素——大彻大悟
1. php array_flip() 删除数组重复元素,如果用于一维索引数组,好理解. [root@BG-DB:~]$more arr.php <?php $arr = ar ...
- C语言 · 删除数组0元素
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数 ...
- Perl删除数组中元素的多种方法
Perl中的数组元素起始引用序号为0,@array的第一个元素为$array[0],依次递增,最后一个元素为$array[-1]或者$#array.如果要删除一个数组中已有的元素,可以用以下几个函数来 ...
- JS Jquery去除数组重复元素
js jquery去除数组中的重复元素 第一种:$.unique() 第二种: for(var i = 0,len = totalArray_line.length;i < len;i++) { ...
- sort() 方法用于对数组的元素进行排序
语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...
随机推荐
- ECMAScript整理笔记(持续更新....)
参考文献: ECMAScript Array:http://www.jimmycuadra.com/posts/ecmascript-5-array-methods ECMAScript5兼容展示大全 ...
- Centos6.4版本下搭建LAMP环境
Centos6.4版本下搭建LAMP环境 配置yum mkdir/mnt/cdrom mount/dev/cdrom /mnt/cdrom 装载光盘 vi /etc/yum.repos.d/Cent ...
- win10任务视图
之所以用到win10任务视图源自于一个需求,就是我想在上班操作电脑的同时想将某个游戏在后台挂机,这样工作归工作,挂机归挂机,互不干扰.win10任务视图就能轻松的解决这个问题. 任务视图 新建任务视图 ...
- c#获取今天星期几
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(DateTime.Now.DayOfWeek)
- net中的编译
1.MSBuild 四个基本块(属性.项.任务.目标): MSBuild属性: 属性是一些键/值对,主要用来存储一些配置信息. MSBuild 项: 主要是存储一些项目文件信息,以及文件的元 ...
- 用python实现哈希表
哈哈,这是我第一篇博客园的博客.尝试了一下用python实现的哈希表,首先处理冲突的方法是开放地址法,冲突表达式为Hi=(H(key)+1)mod m,m为表长. #! /usr/bin/env py ...
- C# 缓存学习总结
昨天整理了一下缓存的基本用法,和缓存依赖类 CacheDependency类的使用,今天整理一下缓存的数据库依赖类SqlCacheDependency 1.数据库依赖类SqlCacheDependen ...
- [转]PLS-S-00201, identifier 'CALLDEMO.GET_EMPLOYEES' must be declared 预编译错误原因及解决办法
$ proc sample9.pc SQLCHECK=SEMANTICS Pro*C/C++: Release 11.2.0.1.0 - Production on Tue Jan 8 15:18:4 ...
- scanf gets fgets区别与联系 puts fputs printf区别与联系
组一:scanf( )函数 gets( )函数 fgets()函数都可用于输入字符串, 组二:printf( )函数 puts( )函数 fputs()函数则用于字符串的输出. 两组内部函数各有 ...
- android----sqlite中的 query() 参数分析
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, Strin ...