剑指Offer66.构建乘积数组
写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点
1. 双向遍历法
1.尝试自己想没想出来于是看答案,方法是两端遍历,分为两段,但是理解错题目了,有点难受。。
int up(int j)
{
if(j==0||j==1) return 1;
return up(j-1)*j;
}//尝试自己写了一个阶乘的递归数组,发现虽然很简单,但是自己写感觉也好慢。
int down(vector<int>&a,int j)
{
if (j==0) return 1;
int max=a.size();
int ans=1,i=0;
while(1)
{
ans*=max; //get
max--;
i++;
if(i>=j) break;
}
return ans;//保证在什么时候都必须有返回值
}//
vector<int> constructArr(vector<int>& a) {
int n=a.size();
vector<int>b(n,1);//这个初始化数组的方法学一下
for(int i=0;i<=n-1;i++)
{
int j=n-i-1;
b[i]=down(a,j)*up(i);
};
return b;
}
};
- 还是基于别人的方法看了一下,思路如下
- 首先题目的意思是构建一个除了本身以外的一个数组,然后去寻找规律
- 定义一个数组,首先正向遍历除自己数字本身以外的数,存在数组b中
- 然后就是反向遍历一个数组与之相乘,即可
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int n=a.size();
vector<int>b(n,1);
int left=1;//定义变量一定要定义呀,争取bug free。
for(int i=0;i<n;i++)
{
b[i]=left;
left=left*a[i];
}
int right=1;
for(int j=n-1;j>=0;j--)
{
b[j]*=right;
right=right*a[j];
}
return b;
}
};