zoukankan      html  css  js  c++  java
  • 两道关于前缀和的算法题

    今天看到了两道有关于前缀和应用的的算法题,解法挺巧妙的,分享给大家。

    在这里直接放上我的代码,题目和注释在代码解释的都非常清楚。

     1     /*
     2      * 题目描述:给定一个数组a[N],我们希望构造数组b[N],
     3      * 其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。
     4      * 在构造过程:不允许使用除法;要求:O(1)空间复杂度和O(n)时间复杂度;
     5      * 除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
     6      */
     7     class ConstructeAarry
     8     {
     9         public void ConstructeAarrySolution(double[] nums)
    10         {
    11             int length = nums.Length;
    12             double[] result = new double[length];//存放结果
    13             //先计算后缀积
    14             for (int i = length - 1; i >= 0; i--)
    15             {
    16                 result[i] = nums[i] * (i == length - 1 ? 1 : result[i + 1]);
    17             }
    18             //再计算前缀积,就会得出结果
    19             double j=1.0;
    20             for (int i = 0; i < length; j *= nums[i++])
    21             {
    22                 result[i] = j * (i == length - 1 ? 1 : result[i + 1]);
    23             }
    24         }
    25     }
    26 
    27 
    28 
    29     /*
    30      * 题目描述:现有一个数组,里面包含了正数和负数,取其中若干个连续的数,要求这些数的和的绝对值最小 
    31      * 对数组A[1....N],做和运算S[1...N],其中S[1] = A[1]; S[2] = A[1]+A[2];...;S[N]=A[1]+A[2]+A[3]+...+A[N]
    32      * 把所有和在数轴上表示出来,则最小值只会出现在相邻两个数之间,故需要排序,所以算法的时间复杂度主要取决于排序的时间复杂度
    33      * 在这里使用快速排序算法
    34      */
  • 相关阅读:
    CSS-DAY03
    Java语言支持的8种基本数据类型
    Linux目录结构
    面向对象的四个基本特征
    使用AVADA头部有搜索icon怎么去掉?
    在ubuntu 上使用apt-get安装 任意版本
    ubuntu 14.04 nginx 1.12.2 配置https遇见的坑
    java Process执行linux命令
    node.js 接收上传的文件
    node.js 进行http get 向服务端请求
  • 原文地址:https://www.cnblogs.com/FJuly/p/4594000.html
Copyright © 2011-2022 走看看