zoukankan      html  css  js  c++  java
  • 给定数组a[N]构造数组b[N]

    转自:http://blog.csdn.net/wumuzi520/article/details/7841280

    给定一个数组a[N],我们希望构造数组b [N],
    其中b[j]=a[0]*a[1]…a[N-1] / a[j],
    在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;
    除遍历计数器与a[N] b[N]外,不可使用新的变量
    (包括栈临时变量、堆空间和全局静态变量等)

    解析:设b[0]=1
    由b[i]=b[i-1]*a[i-1]可得
    b[1] = a[0]
    b[2] = a[0]a[1]

    b[i] = a[0]a[1]a[2]…a[i-1]

    b[n-1] = a[0]a[1]…a[n-2]
    那么再通过b[0]这个变量来迭代出
    1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],
    迭代过程中分别乘以b[n-1], b[n-2], … , b[0]

     1 /*************************************************************************
     2     > File Name: 给定数组a[N]构造数组b[N].c
     3     > Author: Juntaran
     4     > Mail: JuntaranMail@gmail.com
     5     > Created Time: 2016年08月24日 星期三 16时47分25秒
     6  ************************************************************************/
     7 
     8  
     9  /*
    10     给定一个数组a[N],我们希望构造数组b [N],
    11     其中b[j]=a[0]*a[1]…a[N-1] / a[j],
    12     在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;
    13     除遍历计数器与a[N] b[N]外,不可使用新的变量
    14     (包括栈临时变量、堆空间和全局静态变量等)
    15  
    16     解析:设b[0]=1
    17     由b[i]=b[i-1]*a[i-1]可得
    18     b[1] = a[0]
    19     b[2] = a[0]a[1]
    20 21     b[i] = a[0]a[1]a[2]…a[i-1]
    22 23     b[n-1] = a[0]a[1]…a[n-2]
    24     那么再通过b[0]这个变量来迭代出
    25     1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],
    26     迭代过程中分别乘以b[n-1], b[n-2], … , b[0]
    27  
    28  */
    29 
    30 #include <stdio.h>
    31 
    32 void Translate(int a[], int b[], int n)
    33 {
    34     b[0] = 1;
    35     
    36     for (int i = 1; i < n; ++i)
    37     {
    38         b[i] = b[i-1] * a[i-1];
    39     }
    40     
    41     for (int i = 0; i < n; ++i)
    42     {
    43         printf("b[%d] is %d
    ", i, b[i]);
    44     }
    45     printf("
    ");
    46     
    47     for (int i = n-1; i >= 1; --i)
    48     {
    49         b[i] *= b[0];
    50         b[0] *= a[i];
    51     }
    52     
    53     for (int i = 0; i < n; ++i)
    54     {
    55         printf("b[%d] is %d
    ", i, b[i]);
    56     }
    57     printf("
    ");
    58 }
    59 
    60 int main()
    61 {
    62     int a[] = {2,3,4,5};
    63     int b[] = {0,0,0,0};
    64     Translate(a, b, 4);
    65     
    66     for (int i = 0; i < 4; ++i)
    67     {
    68         printf("%4d ", a[i]);
    69     }
    70     printf("
    ");
    71     
    72     for (int i = 0; i < 4; ++i)
    73     {
    74         printf("%4d ", b[i]);
    75     }
    76     printf("
    ");
    77 }
  • 相关阅读:
    Java小案例——对字符串进行加密解密
    Java基础——使用三元运算符判断一个数的奇偶性
    Java基础——字母大小写转换
    多线程实现——新龟兔赛跑
    编程面试题之——简答题(持续更新...)
    多线程之——共享数据
    多线程之——线程的状态
    Android 8.0 Oreo介绍
    Android 7.0 Nougat介绍
    Android 6.0 Marshmallow介绍
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5803676.html
Copyright © 2011-2022 走看看