zoukankan      html  css  js  c++  java
  • 剑指 Offer 66. 构建乘积数组

    剑指 Offer 66. 构建乘积数组

    给定一个数组 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]。不能使用除法。

    示例:

    输入: [1,2,3,4,5]
    输出: [120,60,40,30,24]
    

    思路:

    1. 暴力解法,两层循环,直接求解,但是会涉及到大量的重复计算,最后超出时间限制

    2. 因为不能使用除法,因此只能将表格分割成上三角和下三角进行计算,对角线的元素值置一,如图所示:

      image-20200626111323104

      算法流程:

    初始化:数组 B ,其中 B[0]=1 ;辅助变量 temp=1 ;
    计算 (B[i]) 的 下三角 各元素的乘积,直接乘入 B[i] ;
    计算$ B[i] $的 上三角 各元素的乘积,记为 temp ,并乘入 B[i] ;
    返回 $B $。

    参考作者:jyd


    代码

    class Solution {
        public int[] constructArr(int[] a) {
            // int len = a.length;
            // int[] ans = new int[len];
            // for (int i = 0; i < len; i++) {
            //     ans[i] = 1;
            //     for (int j = 0; j < len; j++) {
            //         if (i != j) {
            //             ans[i] *= a[j];
            //         }
            //     }
            // }
            // return ans;
    
            int len = a.length;
            if (len == 0) return new int[0];
            int[] ans = new int[len];
            ans[0] = 1;
            for (int i = 1; i < len; i++) {
                ans[i] = ans[i - 1] * a[i - 1];
            }
            int temp = 1;
            for (int i = len - 2; i >= 0; i--) {
                temp *= a[i + 1];
                ans[i] *= temp;
            }
            return ans;
        }
    }
    
  • 相关阅读:
    如何使用 systemctl 管理服务
    Linux 下 SVN 的安装和配置
    C语言程序设计
    mysql 常用关键字操作(字符串转数字,字符串截取)
    Spring入门学习---05
    Spring入门学习---03
    使用 TiUP 部署 TiDB 集群
    docker安装kafka+kafka-manager集群
    发发牢骚
    php修改JPG格式图片的dpi
  • 原文地址:https://www.cnblogs.com/gcurry/p/13194178.html
Copyright © 2011-2022 走看看