剑指offer面试题52

来源:互联网 发布:企业网络规划图 编辑:程序博客网 时间:2024/05/18 02:17

自己想出来的!但是花了1个半小时、、、那个规律只要发现了就是秒做

我太倾向于一开始想到的方法,主要是列的乘项规律问题,思维一直停留在平移

却没想到拆分开来看

#include<iostream>#include<string>#include<queue>using namespace std;/*面试题52:给定一个数组A[0…n-1],求B[0…n-1]B[i]=(所有A相乘,但是唯独不乘A[i])不可以用除法*/#define M 20000int a_num[M];int b_num[M];//简单方法:直接每次都乘//M大于50000就出不来了//复杂度为O(n^2)void get_B_bad(int *A,int len,int *B){int i,j;for(i=0;i<len;i++){B[i]=1;for(j=0;j<len;j++){if(j!=i)B[i]*=A[j];}}printf("bad way end!\n");}//好方法:通过观察可发现//B[i]=(i下标前面的乘积和)乘(i下标后面的乘积和)//而i后面的乘积和可以一开始就算出来//i前面的乘积和可以边算边得//此题需要观察规律。。。复杂度为O(n+n)void get_B_good(int *A,int len,int *B){int left,i;int right[M+1];left=1;right[len]=1;for(i=len-1;i>=0;i--){right[i]=right[i+1]*A[i];}for(i=0;i<len;i++){B[i]=left*right[i+1];left*=A[i];}printf("good way end!\n");}int main(){int i;for(i=0;i<M;i++)a_num[i]=1;get_B_good(a_num,M,b_num);}


0 0