LeetCode 238 product of array except self 除自身以外数组的乘积

版权声明:转载请注明原址,有错误欢迎指出 https://blog.csdn.net/iwts_24/article/details/83584777

题目链接

https://leetcode-cn.com/problems/product-of-array-except-self/

题意

        中文题,就是给出一个数组,输出也是一个数组,每个位置是除自身外其他所有数的乘积。要求不能用除法,以及时间复杂度为O(n)。进阶的条件是常数的空间复杂度。

题解

        也是比较有趣的题,不能用乘法,很想知道oj怎么知道有没有用除法,难道是看代码有没有符号“*”么= =。不过在O(n)时间复杂度下还是能写出来的。能用除法的话,就是第一轮遍历,直接求所有数的乘积,然后第二轮遍历就除以原数得到答案。如果不能用除法,那么就可以考虑,除了本身,将两边的乘积再相乘。不过这样时间复杂度就是O(n^2)了。

        我的想法是,如果能遍历两轮,第一轮正常乘,第二轮反向正常乘,这样对于i而言,[0,i-1]的就是左边的正确乘积,那么反向正常乘的时候,[i+1,len-1]的乘积就是右边的正确乘积。同时为了满足常数级的空间复杂度,第一轮正向就直接在答案数组上进行,反向的时候,利用temp,反向直接确定正确答案。

        表达不太清楚感觉,直接撸代码吧,速度还是能保证的。

Java代码

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] ans = new int[len];
        ans[0] = nums[0];
        for(int i = 1;i < len-1;i++){
            ans[i] = nums[i]*ans[i-1];
        }
        ans[len-1] = ans[len-2];
        int temp = nums[len-1];
        for(int i = len-2;i >= 1;i--){
            ans[i] = ans[i-1]*temp;
            temp *= nums[i];
        }
        ans[0] = temp;
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/iwts_24/article/details/83584777
今日推荐