• 剑指offer-JZ51-构建乘积数组


    题目:给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

    分析:连乘问题首先要考虑有没有0

    首先计算A数组的长度,将B初始化为同size的数组(各元素均为0)

    然后遍历A数组,找其中0元素的个数,并将其索引保存下来,若找到两个以上0元素,则B数组均为0;

    若找到1个0元素,则B数组只有一个索引不为0,其他索引均为0;

    若没有找到0元素,则使用土办法进行计算。

     1 #include <iostream>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 class Solution
     7 {
     8 public:
     9     vector<int> multiply(const vector<int>& A) 
    10     {
    11         int num = A.size();
    12         vector<int> zero; 
    13         vector<int> result;
    14 
    15         for (int i = 0; i < num; i++)
    16         {
    17             result.push_back(0);
    18             if (A[i] == 0) zero.push_back(i);
    19         }
    20         if (zero.size() == 1)
    21         {
    22             //修改此值 result[zero[0]]
    23             int temp = zero[0];
    24             int sum = 1;
    25             for (int i = 0; i < num; i++)
    26             {
    27                 if (i!=temp)
    28                     sum *= A[i];
    29                 else continue;
    30             }
    31             result[temp] = sum;         
    32         }
    33 
    34         else if (zero.size() == 0)//修改所有result值
    35         {
    36             int j = 0;
    37             while (j<num)
    38             {
    39                 int sum = 1;
    40                 for (int i = 0; i < num; i++)
    41                 {
    42                     if (i != j)
    43                     {        
    44                         sum *= A[i];
    45                     }
    46                     else continue;
    47                     result[j] = sum;
    48                 }
    49                 j += 1;
    50                 
    51             }
    52         }    
    53         return result;
    54     }
    55 };
    56 
    57 int main()
    58 {
    59     Solution sol;
    60     vector<int> result;
    61     vector<int> A{ 1, 2, 0, 4, 5 };
    62     result = sol.multiply(A);
    63 
    64     for (int i = 0; i < A.size();i++)
    65         cout << result[i] << endl;
    66 
    67     int u;
    68     cin >> u;
    69     return 0;
    70 }

     

  • 相关阅读:
    暑假集训Day14 I (莫队)
    暑假集训Day14 G (gcd 数学)
    暑假集训Day13 H (进制转换 数学)
    暑假集训Day13 C (二分+贪心)
    暑假集训Day13 I (区间DP)
    暑假集训Day12 H (数论 STL)
    Java8中list转map方法总结
    Typora ---一款简洁的Markdown编辑器
    java8 map flatmap
    Elasticsearch基本查询总结
  • 原文地址:https://www.cnblogs.com/pgzhanglin/p/13392152.html
Copyright © 2020-2023  润新知