第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;
    }
}
原文地址:https://www.cnblogs.com/xiaobaidashu/p/12093297.html