您的位置:首页 > 其它

【LeetCode】238. Product of Array Except Self

2015-07-25 11:34 316 查看
Product of Array Except Self

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

Solve it without division and in O(n).

For example, given
[1,2,3,4]
, return
[24,12,8,6]
.

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

就是用减法实现除法。

注意零的处理。

class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int size = nums.size();
vector<int> ret(size, 0);
long long product = 1;
int countZero = 0;
int ind = -1;   // 0-index

for(int i = 0; i < size; i ++)
{
if(nums[i] == 0)
{
countZero ++;
ind = i;
}
}

//special case for 0
if(countZero == 0)
{//no zero
for(int i = 0; i < size; i ++)
product *= nums[i];
for(int i = 0; i < size; i ++)
ret[i] = mydivide(product, nums[i]);
}
else if(countZero == 1)
{//1 zero
for(int i = 0; i < size; i ++)
{
if(i != ind)
product *= nums[i];
}
ret[ind] = product; //others are 0s
}
else
{//2 or more zeros
;   //all 0s
}

return ret;
}
int mydivide(long long product, int divisor)
{// guaranteed that divisor is not 0
int sign = 1;
if((product < 0) ^ (divisor < 0))
sign = -1;
if(product < 0)
product = -product;
if(divisor < 0)
divisor = -divisor;
//to here, product and divisor are positive
int ret = 0;
while(true)
{
int part = 1;   //part quotient
int num = divisor;
while(product > num)
{
num <<= 1;
part <<= 1;
}
if(product == num)
{
ret += part;
return sign * ret;
}
else
{
num >>= 1;
part >>= 1;
ret += part;
product -= num;
}
}
}
};


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: