工作之余刷刷题排解下寂寞-1
面试题66. 构建乘积数组:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/
解题思路:题目要求可以简化为求数组中任意一个元素左右两边所有元素的乘积。(偷懒就用了一个套路,练习了p/c/c++)
python:
class Solution:
def constructArr(self, a: List[int]) -> List[int]:
#除法是最简单的但是题目不能用,想对于b中任意一个结果,正好是b【i】左边的乘积*右边的乘积
if not a:
return []
#i左边每一位乘积
res=[]
left=1
right=1
for i in range(len(a)):
#要延迟一位
res.append(left)
left=left*a[i]
#同理右边再乘上左边的结果
for i in range(len(a)-1,-1,-1):
#延迟一位
res[i]=res[i]*right
right=right*a[i]
return res
类似C++
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
//类似前面python的方法
vector<int> res;
if(a.size()==0){
return res;
}
//左边
int left_start=1;
int right_start=1;
//i的左边
for(int i=0;i<a.size();i++){
res.push_back(left_start);
left_start*=a[i];
}
//左边再乘右边的结果
for(int i=a.size()-1;i>=0;i--){
res[i]*=right_start;
right_start*=a[i];
}
return res;
}
};
C:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* constructArr(int* a, int aSize, int* returnSize){
//结果
int* res=(int*)malloc(sizeof(int)*aSize);
int left=1;
int right=1;
//左边
for(int i=0;i<aSize;i++){
res[i]=left;
left*=a[i];
}
for(int i=aSize-1;i>=0;i--){
res[i]*=right;
right*=a[i];
}
*returnSize=aSize;
return res;
}
本文解析了LeetCode上的构建乘积数组问题,提供了一种高效解决方案,避免使用除法,通过两次遍历数组实现左右两边元素乘积的计算。
1033

被折叠的 条评论
为什么被折叠?



