zoukankan      html  css  js  c++  java
  • 构建乘积数组

    题目描述

    给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

    解题:用临时变量tmp保存a[i]的值,之后将a[i]=1;b[i]计算出来之后再将a[i]恢复原来的值。这样传的参数前不能加 const ,因为你修改了它的值。

    c++代码:

    class Solution {
    public:
        vector<int> multiply(vector<int>& a) {
        vector<int> ans;
        int s=1,tmp=1;    
        for(int i=0;i<a.size();i++){
         tmp=a[i];
         a[i]=1;   
        for(int j=0;j<a.size();j++){
         s*=a[j];   
        }
        ans.push_back(s);
        s=1;
        a[i]=tmp;    
        }return ans;    
            
            
        }
    };

    官方解法:

    剑指的思路:
    B[i]的值可以看作下图的矩阵中每行的乘积。
    下三角用连乘可以很容求得,上三角,从下向上也是连乘。
    因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

    java代码如下:

    public class Solution {
        public int[] multiply(int[] A) {
            int length = A.length;
            int[] B = new int[length];
            if(length != 0 ){
                B[0] = 1;
                //计算下三角连乘
                for(int i = 1; i < length; i++){
                    B[i] = B[i-1] * A[i-1];
                }
                int temp = 1;
                //计算上三角
                for(int j = length-2; j >= 0; j--){
                    temp *= A[j+1];
                    B[j] *= temp;
                }
            }
            return B;
        }
    }

     先从左到右乘,之后乘上从右到左乘的结果

    class Solution {
        public int[] constructArr(int[] a) {
        int len = a.length;
        if(len==0) return new int[0];
        int []b = new int[len];
        //Arrays.fill(b,1);
        b[0]=1;
        int temp = 1;
        for(int i=0;i<len-1;i++){/* 从左往右累乘(不包括自己) */
        temp*=a[i];//temp保存从左到右乘的结果
        b[i+1]=temp;   
        }
        temp=1;
        for(int i=len-1;i>0;i--){/* 从右往左累乘(不包括自己) */
        temp*=a[i];//temp保存从右到左乘的结果
        b[i-1]*=temp;
        }
        return b;
        }
    }

     

    不一样的烟火
  • 相关阅读:
    bless for you...
    Unity3D 热更新方案(集合各位专家的汇总)
    Unity与iOS原生代码之间的相互调用
    unity android相互调用
    unity3d资源打包总结
    Unity3D热更新LuaFramework入门实战
    unity插件开发
    Unity3D性能优化总结
    正确释放Vector的内存
    CCLuaObjcBridge
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11248872.html
Copyright © 2011-2022 走看看