列表

详情


NC213. 除自身以外数组的乘积

描述

给定一个长度为 n 的数组 nums ,返回一个数组 res,res[i]是nums数组中除了nums[i]本身以外其余所有元素的乘积,即:

1.请不要使用除法,并且在 O(n) 时间复杂度内完成此题。
2.题目数据保证res数组的元素都在 32 位整数范围内
3.有O(1)空间复杂度的做法,返回的res数组不计入空间复杂度计算

数据范围:

示例1

输入:

[1,2,3,4]

输出:

[24,12,8,6]

说明:

res[0]=2*3*4=24 res[1]=1*3*4=12 res[2]=1*2*4=8 res[3]=1*2*3=6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 17ms, 内存消耗: 2584KB, 提交时间: 2021-12-28

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> timesExceptSelf(vector<int>& nums) {
        // write code here
        int size = nums.size();
        vector<int> left;
        left.resize(size);
        vector<int>  right;
        right.resize(size);
        
        left[0] =1;
        right[size-1] = 1;
        for(int i = 1; i < size; ++i)
        {
            left[i] = nums[i-1]*left[i-1];
            right[size-1-i] = nums[size-i] *right[size-i];
        }
        
        for(int i =0; i < size; ++i)
        {
            left[i] *= right[i];
        }
        
       
        return left;
    }
};

C++ 解法, 执行用时: 17ms, 内存消耗: 2616KB, 提交时间: 2022-02-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> timesExceptSelf(vector<int>& nums) {
        // write code here
        vector<int> vec;
        int temp=1;
        for(int i=0;i<nums.size();i++)
        {
            temp=temp*nums[i];
        }
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==0)
            {
                int temp1=1;
                for(int j=0;j<nums.size();j++)
                {
                    if(j!=i)
                    {
                        temp1=temp1*nums[j];
                    }
                }
                vec.push_back(temp1);
            }else{
                vec.push_back(temp/nums[i]);
            }
           
        }
        return vec;
    }
};

C 解法, 执行用时: 18ms, 内存消耗: 2216KB, 提交时间: 2022-02-06

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int* timesExceptSelf(int* nums, int numsLen, int* returnSize ) {
    int *a=(int *)malloc(numsLen*sizeof(int));
    int add=1;
    int i;
    for(i=0;i<numsLen;i++)
    {
        a[i]=add;
        add=add*nums[i];
    }
    add=1;
    for(i=numsLen-1;i>=0;i--)
    {
        a[i]=a[i]*add;
        add=add*nums[i];
    }
    *returnSize=numsLen;
    return a;
}

C++ 解法, 执行用时: 18ms, 内存消耗: 2588KB, 提交时间: 2021-12-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> timesExceptSelf(vector<int>& nums) {
        // write code here
        int n = nums.size();
        vector<int> ret(n,1);
        
        int tmp = nums[0];
        for(int i = 1; i<n; ++i){
            ret[i] *= tmp;
            tmp *= nums[i];
        }
        
        tmp = nums[n-1];
        for(int i=n-2; i>=0; --i){
            ret[i] *= tmp;
            tmp *= nums[i];
        }
        
        return ret;
    }
};

C++ 解法, 执行用时: 18ms, 内存消耗: 2608KB, 提交时间: 2022-01-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> timesExceptSelf(vector<int>& nums) {
        // write code here
        
        int len = nums.size();
        if(len < 2)
        {
            return {};
        }
        vector<int> ret_vec(len,1);
        for(int i = 1; i < len; ++i)
        {
            ret_vec[i] = ret_vec[i-1]*nums[i-1];
        }
        int tmp1 = nums[len-1],tmp2;
        nums[len -1] = 1;
        for(int i = len-2; i >= 0; --i)
        {
            tmp2 = nums[i];
            nums[i] = tmp1 * nums[i+1];
            tmp1 = tmp2;
        }
        for(int i = 0; i < len; ++i)
        {
            ret_vec[i]*=nums[i];
        }
        return ret_vec;
    }
};

上一题