面试编程题(三)
一、除自身以外数组的乘积
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int* ret = (int*)malloc(numsSize * sizeof(int));*returnSize = numsSize;//记录左边和右边的乘积int left = 1, right = 1;// 第一次循环,将当前位置左边的数字乘积填入返回数组中for (int i = 0; i < numsSize; i++) {ret[i] = left; // 1 nums[0] nums[0]*nums[1] num[0]*nums[1]*nums[2] ....left *= nums[i];}// 第二次循环,对于返回数组的元素从后往前进行,每次乘以右边元素的乘积for (int i = numsSize - 1; i >= 0; i--) {ret[i] *= right; // 最后一个成绩不需要乘以最后元素,乘以1就行right *= nums[i]; // right变化:1 nums[end] nums[end]*nums[end-1] .....}return ret;
}
这道题可以简单的暴力求解,先求一遍整个数组的乘积,然后在分别除以对应的数即可。现在我用left和right来记录数组中对应位置的左边和右边的乘积,最后把他们给乘起来就可以得到最后的满足题目要求的答案。
leetcodehttps://leetcode.cn/problems/product-of-array-except-self/description/