一: 给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。
在构造过程:
1、不允许使用除法;
2、要求O(1)空间复杂度和O(n)时间复杂度;
3、除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
void makeArray(int a[],int b[],int len) { int i,j; b[0] = 1; for(i=1;i<len;i++) { b[i] = b[i-1]*a[i-1]; //累乘a[0]*a[1]...a[i-1] } b[0] = a[len-1]; for(j=len-2;j>0;j--) { b[j] *= b[0]; b[0] *= a[j]; } }
二:学习心得
1 对于这种带要求的(要求苛刻的)问题,就要求我们不能应用常规的方法来思考它;
2 这种题,一般有一些特点,里面的技巧性很强,当然也比较容易发现,从递推公式中可以看出一些端倪;
3 你用常规的方法书写时 再加上 从递推公式中可以看出一些端倪 应该不难看出它的解法
4 平时一定要多多练习,在自己快速地写完一个算法题后,想一想有没有更优的方法,哪怕只有一点点代码优化;
5 代码优化,也是在面试的时候面试官,在你写完代码后,最爱问的一个问题。
时间: 2024-09-27 03:41:39