238. Product of Array Except Self

Given an array nums of n integers where n > 1,  return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

Example:

Input:  [1,2,3,4]
Output: [24,12,8,6]

Note: Please solve it without division and in O(n).

Follow up:
Could you solve it with constant space complexity? (The output array does not count as extra space for the purpose of space complexity analysis.)

方法一:除法

计算全部数字的乘积,然后分别除以num数组中的每一个数(需要处理数字0的情况)。

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> result(nums.size(),0);
        int count = 0;
        int  mult = 1;
        for(int i = 0; i<nums.size();i++)
        {
           if(nums[i]!=0)
            mult *= nums[i];
          else
            count++;
        }
        //2个及以上的0
        if(count >1)
        {
          return result;
        }
        //1个0
        else if(count == 1)
        {
          for(int i = 0; i<nums.size();i++)
          {
            if(nums[i] == 0)
               result[i] = mult;
          }
        }
        //没有0
        else
        {
          for(int i = 0; i<nums.size();i++)
          {
            result[i] = mult/nums[i];
          }
        }     
        return result;
    }
};

方法二:正反遍历数组

由于result[i] = (x0 * x1 * ... * xi-1) * (xi+1 * .... * xn-1),因此执行两次循环:

  • 首先正向遍历数组,计算x0 ~ xi-1的乘积;
  • 然后反向遍历数组,计算xi+1 ~ xn-1的乘积;

算法的时间复杂度O(n),空间复杂度O(1)。

class Solution {
public:
   vector<int> productExceptSelf(vector<int>& nums) {
	int left = 1, right = 1;
	vector<int> result(nums.size(), 1);
	for (int i = 1; i<nums.size(); i++)
	{		
		left *= nums[i - 1];
		result[i] = left;
	}

	for (int i = nums.size() - 2; i >=0 ; i--)
	{
		right = right* nums[i + 1];
		result[i] *= right;		
	}
	return result;
}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值