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].
Java Solution 1
public int[] productExceptSelf(int[] nums) { int[] result = new int[nums.length]; int[] t1 = new int[nums.length]; int[] t2 = new int[nums.length]; t1[0]=1; t2[nums.length-1]=1; //scan from left to right for(int i=0; i<nums.length-1; i++){ t1[i+1] = nums[i] * t1[i]; } //scan from right to left for(int i=nums.length-1; i>0; i--){ t2[i-1] = t2[i] * nums[i]; } //multiply for(int i=0; i<nums.length; i++){ result[i] = t1[i] * t2[i]; } return result; } |
Java Solution 2
We can directly put the product values into the final result array. This saves the extra space to store the 2 intermediate arrays in Solution 1.
public int[] productExceptSelf(int[] nums) { int[] result = new int[nums.length]; result[nums.length-1]=1; for(int i=nums.length-2; i>=0; i--){ result[i]=result[i+1]*nums[i+1]; } int left=1; for(int i=0; i<nums.length; i++){ result[i]=result[i]*left; left = left*nums[i]; } return result; } |
Hi guys,
I created a small video explaining the prefix sum logic and constant time complexity approach. Please check, any suggestions are welcome 🙂
https://www.youtube.com/watch?v=XBgqx0jwAfw
class Solution {
public:
vector productExceptSelf(vector& nums) {
vector ans(nums.size(), 1);
/* ans[i] will be the prefix multiplication nums[0] * nums[1] * .... * nums[i - 1] */
for(int i = 0; i 0 ? ans[i - 1] * nums[i - 1] : 1);
}
/* suffixMul will be the suffix multiplication at any index i */
int suffixMul = 1;
for(int i = nums.size() - 1; i >= 0; i--) {
ans[i] *= suffixMul;
suffixMul *= nums[i];
}
return ans;
}
}
(then God speaking).. Practice makes you mortals perfect!!
How the fuck in this world will i know that i have to do this. How can anyone even think of this intuitively. Who ever is are GODS.
still you are creating `n` new objects:
int[] result = new int[nums.length];
Space required is the input and output space. In this case that is the result and the nums array. Unlike the first solution where we were taking O(n) space for right and left arrays, we are declaring only constants in the second solution.
Why space O(1) for 2nd solution. It should be O(n) for result
Second solution is wrong. The second loop in the second program should start from i=1 and not i=0. result[0] is already determined.
it says to do it without division
Simple solution without using extra space
import java.util.*;
import java.io.*;
public class Product_of_Array_except_Self {
public static void main(String args[])throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out, true);
int arr[]=new int[5];
pw.println(“Enter 5 element of array”);
for(int i=0;i<5;i++)
{
arr[i]=Integer.parseInt(br.readLine());
}
int product=1;
for(int i=0;i<5;i++)
{
product=product*arr[i];
}
for(int i=0;i<5;i++)
{
int temp=arr[i];
arr[i]=product/temp;
}
pw.println(Arrays.toString(arr));
}
}