第238题:除自身以外数组的乘积
一. 问题描述
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间)
二. 解题思路
本题思路:本题采用双指针的方式进行求解,由于题目要求请不要使用除法,且在 O(n) 时间复杂度内完成此题,所以我们应考虑到常数次的遍历,采用左右指针的方法进行求解。
步骤一:创建两个长度为n初始化为1的数组fir和sec。
步骤二:创建左右指针,分别从第二个数和倒数第二个数进行遍历,
fir[j]=fir[j-1]*nums[j-1];
sec[m]=sec[m+1]*nums[m+1];
步骤三:将两个数组对应数组相乘,输出最终数组。
三. 执行结果
执行用时 :1 ms, 在所有 java 提交中击败了100.00%的用户
内存消耗 :43.2 MB, 在所有 java 提交中击败了96.20%的用户
四. Java代码
class Solution { public int[] productExceptSelf(int[] nums) { int []fir=new int[nums.length]; int []sec=new int[nums.length]; for(int i=0;i<nums.length;i++) { fir[i]=1; sec[i]=1; } for(int j=1,m=nums.length-2;j<nums.length&&m>=0;j++,m--) { fir[j]=fir[j-1]*nums[j-1]; sec[m]=sec[m+1]*nums[m+1]; } for(int k=0;k<nums.length;k++) { fir[k]=fir[k]*sec[k]; } return fir; } }