题目:

给定一个整数数组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 :数组剔除元素后的乘积的更多相关文章

  1. LintCode-50.数组剔除元素后的乘积

    数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出A=[1 ...

  2. lintcode50 数组剔除元素后的乘积

    数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 您在真实的面试中是 ...

  3. LintCode_50 数组剔除元素后的乘积

    题目 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出A=[1, 2, 3], ...

  4. C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

    C#实现如何判断一个数组中是否有重复的元素   如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...

  5. php array_flip() 删除数组重复元素——大彻大悟

    1. php array_flip() 删除数组重复元素,如果用于一维索引数组,好理解. [root@BG-DB:~]$more arr.php  <?php         $arr = ar ...

  6. C语言 · 删除数组0元素

    从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数 ...

  7. Perl删除数组中元素的多种方法

    Perl中的数组元素起始引用序号为0,@array的第一个元素为$array[0],依次递增,最后一个元素为$array[-1]或者$#array.如果要删除一个数组中已有的元素,可以用以下几个函数来 ...

  8. JS Jquery去除数组重复元素

    js jquery去除数组中的重复元素 第一种:$.unique() 第二种: for(var i = 0,len = totalArray_line.length;i < len;i++) { ...

  9. sort() 方法用于对数组的元素进行排序

    语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...

随机推荐

  1. 惠普M1005打印机无法自动进纸的问题

    惠普M1005打印机无法自动进纸的问题 问题起因 其实我也不太清楚是什么起因,前一天用的好好的惠普M1005打印机,在打印时没有直接打印,会弹出一个提示对话框,同时打印机显示屏上显示“load tra ...

  2. PHP+AJAX无刷新返回天气预报

    AjaxJavaScript天气预报php天气预报,用php来写一个天气预报的模块. 天气数据是通过采集中国气象网站的.本来中国天气网站也给出了数据的API接口.以下是API的地址.返回的数据格式为j ...

  3. jQuery实现公告文字左右滚动

    jQuery实现公告文字左右滚动的代码. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  4. hibernate知识点理解

    1.只有业务逻辑层出现的问题? 1.切换数据库麻烦 2.sql编写起来麻烦 3.我们的程序员不需要关注数据库,只希望关心业务本身 2.hibernate的好处 1.程序员只关心业务逻辑,使角色更加清楚 ...

  5. python_day2_homework_1(简单购物商城)

    '''简单购物商城(要求):1,商品展示,价格2,买,加入购物车3,付款,钱不够''' 1 #_*_ coding: utf-8 _*_ __author__ = 'A-rno' meu_list_1 ...

  6. VirtualBox中虚拟Ubuntu添加新的虚拟硬盘

    VirtualBox中装好Ubuntu后,发现硬盘空间不够使用 了.以下是搜集整理的解决办法: 1. 添加新硬盘 设置 -> Storage -> SATA控制器->右击,选择&qu ...

  7. 从零开始学ios开发(六):IOS控件(3),Segmented Control、Switch

    这次的学习还是基于上一个项目继续进行(你也可以新建一个项目)学习Segmented Control和Switch. Segmented Control Switch Segmented Control ...

  8. 在eclipse中使用jax-ws构建webservices服务端和客户端

    服务端: package com.yinfu.service; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebServi ...

  9. UML 小结(5)- 图解 Rational Rose 的详细安装过程

    在学习UML的时候,会用到画图工具:Rotional Rose . 原以为这款软件直接下载下来或者跟朋友那边拷过来就可以直接用了,结果却是没有那么简单,如果读者您也是为了解决这个家伙的安装问题的话,那 ...

  10. 面试问到的Spring

    一.介绍Spring 1.主要使用了基本的javabean代替的Ejb  Ejb:服务端的组件模型,设计目标应用部署分布在应用程序,把已经做好的编好的程序,打包放在服务 端执行,凭借java跨平台的优 ...