首页 > 其他分享 >leet code 238. 除自身以外数组的乘积

leet code 238. 除自身以外数组的乘积

时间:2023-10-22 17:01:11浏览次数:38  
标签:leet code 乘积 nums int right 238 数组 ans

238.除自身以外数组的乘积

题目解析

  • 题目要求 O(n) 的时间复杂度完成
  • 进阶:O(1) 空间复杂度 完成

先不想那么多,先按照暴力思路来一遍

  • 对于每一个元素,要求得除自身以外数组的乘积,那么可以遍历所有剩下的元素进行相乘,然后得出结果
  • 这样的话 时间复杂度 来到了:leet code 238. 除自身以外数组的乘积_数组
  • 显然不行
  • 直接算出所有元素的乘积,再除以 当前元素是可以的,但是又不允许用除法
  • 看了下 题目标签:前缀和
  • 但是如何运用前缀和呢?
  • 想不出来啊
  • 倒着想,首先的话,肯定是需要进行计算的。遍历一遍数组元素。
  • 对于任意一个元素的话
  • 要想求:除自身以外数组的乘积
  • 那么可以进行换算:其左边所有元素的乘积 * 其右边所有元素的乘积 = 除自身以外数组的乘积
  • 那么的话可以创建两个数组分别代表
  • 左前缀积和
  • 右前缀积和
  • 如下图

leet code 238. 除自身以外数组的乘积_i++_02

show code

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] left = new int[n];
        int[] right = new int[n];

        // 首先求左前缀积
        int ans = 1;
        for(int i = 0;i < n;i++) {
            left[i] = ans * nums[i];
            ans = left[i];
        }

        ans = 1;
        // 求右前缀积
        for(int i = n - 1;i >= 0;i--) {
            right[i] = ans * nums[i];
            ans = right[i];
        }

        int[] ret = new int[n];
        for (int i = 0; i < n; i++) {
            int leftIdx = i - 1;
            int rightIdx = i + 1;
            ret[i] = (leftIdx < 0 ? 1 : left[leftIdx]) * (rightIdx == n ? 1 : right[rightIdx]);
        }

        return ret;
    }
}

进阶实现

  • 通过 O(n) 的空间复杂度解决了问题。
  • 如果通过 O(1) 的空间复杂度解决呢?
  • 直观地,通过O(1) 的空间复杂度解决的话,需要两个变量 来分别代替 左前缀积和右前缀积 数组
  • 那么如何实现这一操作呢?好像不是那么简单
学习官解
  • 有一个重要信息
  • 输出的数组将不被视为额外空间
  • 那么的话,可以用输出数组作为辅助来计算.
public int[] best(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];

        // ans[i] 表示索引 i 左侧所有元素的乘积
        // 索引 0 左边没有元素,所以初始化为  1
        ans[0] = 1;

        for (int i = 1; i < n; i++) {
            ans[i] = ans[i - 1] * nums[i - 1];
        }

        // right 为右侧所有元素的乘积
        // 初始化 右侧没有元素,right = 1
        int right = 1;
        for(int i = n - 1;i >= 0;i--) {
            // 对于索引 i , 左边的乘积为 ans[i] , 右边的乘积为 right
            ans[i] = ans[i] * right;

            // 计算右边的乘积
            right *= nums[i];
        }

        return ans;
    }

标签:leet,code,乘积,nums,int,right,238,数组,ans
From: https://blog.51cto.com/u_16079703/7977889

相关文章

  • Xcode 15.0.1 (15A507) 发布下载 - Apple 平台 IDE
    Xcode15.0.1(15A507)-Apple平台IDEIDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS请访问原文链接:https://sysin.org/blog/apple-xcode-15/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgvisonOS支持已更新。Xcode15使您能够为所有Apple平台开发、测......
  • Transformer-based Encoder-Decoder Models
    整理原链接内容方便阅读https://colab.research.google.com/github/patrickvonplaten/notebooks/blob/master/Encoder_Decoder_Model.ipynbtitle:"Transformer-basedEncoder-DecoderModels"thumbnail:/blog/assets/05_encoder_decoder/thumbnail.pngauthors:user:p......
  • 论文阅读:SceneEncoder: Scene-Aware Semantic Segmentation of Point Clouds with A L
    SceneEncoder:Scene-AwareSemanticSegmentationofPointClouds withALearnableSceneDescriptorSceneEncoder:用可学习的场景描述符对点云进行场景感知的语义分割摘要除了局部特征,全局信息在语义分割中起着至关重要的作用,而最近的工作通常不能明确地提取有意义的全局信息......
  • Linux Kernel Code init/main.c
    1/*2*linux/init/main.c3*4*Copyright(C)1991,1992LinusTorvalds5*6*GK2/5/95-ChangedtosupportmountingrootfsviaNFS7*Addedinitrd&change_root:WernerAlmesberger&HansLermen,Feb......
  • 【刷题笔记】91. Decode Ways
    题目Amessagecontaininglettersfrom A-Z isbeingencodedtonumbersusingthefollowingmapping:'A'->1'B'->2...'Z'->26Givena non-empty stringcontainingonlydigits,determinethetotalnumberofwayst......
  • leet code 45 && 55 跳跃游戏
    45.跳跃游戏II55.跳跃游戏总结反思首先去尝试完成了一下第55题,跳跃游戏。没能独立解决问题,然后看过题解之后又重新去尝试独立完成第45题,跳跃游戏II。结果还是没搞定。看了题解之后发现两道题目的解题思路大同小异.但是作为我自己,在看过第55题的题解之后还是没能解决第45......
  • Codeforces Round 855 (Div. 3) C. Powering the Hero
    有\(n\)张卡的卡堆,你可以自顶向下抽卡。装备卡显示数值为\(a_i(a_i>0)\),英雄卡显示数值为\(a_i=0\)。如果是装备卡,你可以将卡抽出放在装备堆。如果是英雄卡,你可以将装备堆顶端的一张数值为\(x\)的装备卡装备给英雄,英雄数值\(+x\)。无论是否装备,都加入英雄堆。询问......
  • Codeforces Round 857 (Div. 2) B. Settlement of Guinea Pigs
    你非常喜欢豚鼠。每个笼子可以住两只豚鼠,且你不想把每个笼子放入不同性别的豚鼠。豚鼠只有两种性别。假设你买到豚鼠时并不知道性别,只有医生能够分辨。接下来的\(n\)天方案中,若第\(i\)天为\(1\),你买入一只豚鼠;若为\(2\),你请医生分辨你的豚鼠性别。给出方案,你最少需要准......
  • Educational Codeforces Round 145 (Rated for Div. 2) B. Points on Plane
    给一个二维平面,你需要在上面放\(n\)个芯片。将一个芯片放在\((x,y)\)的代价为\(|x|+|y|\)。放\(n\)个代价的代价为,所有芯片中耗费的最大代价。并且你需要保证任意两个芯片之间的距离严格\(>1\)。现在给出\(n\)给芯片,询问放\(n\)个芯片的最小代价。一:不难想到......
  • VSCode配置Clang C/C++开发环境 [+clangd代码静态检查配置]
    问题:gcc/g++是c/c++使用最广泛的编译器,也是linux默认自带的编译套件,但在vscode上,也可通过微软官方提供的C/C++插件很便捷进行c/c++代码编译调试,但是该插件的自动补全和代码提示等功能很差,经常给不出合理的候选项。另外一套C/C++代码编译套件是基于LLVM的clang/clang++编译器、ll......