首页 > 其他分享 >LeetCode面试150——238除自身以外数组的乘积

LeetCode面试150——238除自身以外数组的乘积

时间:2024-08-03 15:56:38浏览次数:14  
标签:150 乘积 nums 复杂度 元素 238 数组 answer LeetCode

题目难度:中等

默认优化目标:最小化平均时间复杂度。

Python默认为Python3。

目录

1 题目描述

2 题目解析

3 算法原理及代码实现

3.1 左右乘积列表

参考文献


1 题目描述

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

提示:

  • 2 <= nums.length <= 105

  • -30 <= nums[i] <= 30

  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)

2 题目解析

输入是数组nums,输出是除nums[i]各元素的累乘结果组成的数组answer

由于题目禁用除法,我们只能老老实实用乘法,而不能所有元素累乘然后除以对应下标。按照暴力求解,将除了下标的元素累乘,总共要进行n遍,平均时间复杂度为O(n^2),不可行。

3 算法原理及代码实现

3.1 左右乘积列表

我们转换个思路,除去元素nums[i]其余元素累乘,等价于nums[i]左边的元素和右边的元素累乘。据此,我们初始化两个数组LR。其中,L[0]=1R[n-1]=1nnums的长度。我们执行如下步骤:

①初始化LR

②对于LL[i]=L[i-1]*nums[i-1]

③对于RR[i]=R[i+1]*nums[i+1]

answer[i]=L[i]*R[i]

这样平均时间复杂度为O(n),平均空间复杂度为O(n)。

进一步优化,我们观察发现,空间复杂度主要应为开辟了LR而变得复杂,那我们能不能不要LR呢?我们可以将原来的L直接用answer来代替,answer[i]代表i左侧所有元素的乘积。然后,用一个变量R跟踪右边元素的乘积,即answer[i]=answer[i]*RR=R*nums[i]

这样,平均时间复杂度为O(n),平均空间复杂度为O(1)。

C++代码实现

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        int R=1;
        vector<int> answer(n);
​
        answer[0]=1;
        for(int i=1;i<n;i++){
            answer[i]=answer[i-1]*nums[i-1];
        }
​
        for(int i=n-1;i>=0;i--){
            answer[i]*=R;
            R*=nums[i];
        }
​
        return answer;
    }
};

Python代码实现

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n,R=len(nums),1
        answer=[1]*n
​
        for i in range(1,n):
            answer[i]=answer[i-1]*nums[i-1]
​
        for i in range(n-1,-1,-1):
            answer[i]*=R
            R*=nums[i]
​
        return answer

参考文献

力扣面试经典150题

力扣官方题解

标签:150,乘积,nums,复杂度,元素,238,数组,answer,LeetCode
From: https://blog.csdn.net/Junmo12345/article/details/140891855

相关文章

  • leetcode数论(2523. 范围内最接近的两个质数)
     前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。描述给你两个正整数 left 和 right ,请你找到两个整数 num1 和 num2 ,它们满足:left<=nums1<nums2<=right  。nums1 和 nums2 都是 质数 。nums2-nums1......
  • LeetCode | 单链表操作
    LeetCode203移除链表元素LeetCode707设计链表LeetCode206反转链表主类ListNodepackagecom.github.dolphinmind.linkedlist.uitls;/***@authordolphinmind*@ClassNameListNode*@description*@date2024/8/3*///链表组成元素:节点publicclass......
  • K11505 The Lost cow[USACO-2017-USOpen-B]
    题目描述FarmerJohn最珍贵的奶牛Bessie丢了,他需要把它找回来。幸运的是,农场里只有一条长长的直路,他知道Bessie肯定在这条路上的某个地方。如果我们把这条路看成数轴,假设FarmerJohn所在位置是x,Bessie所在的位置是y(对于John是未知的),如果FarmerJohn知道Bessie的位置,那么他就......
  • LeetCode 1041. Robot Bounded In Circle
    原题链接在这里:https://leetcode.com/problems/robot-bounded-in-circle/description/题目:Onaninfiniteplane,arobotinitiallystandsat (0,0) andfacesnorth.Notethat:The northdirection isthepositivedirectionofthey-axis.The southdirection ......
  • LeetCode 1017. Convert to Base -2
    原题链接在这里:https://leetcode.com/problems/convert-to-base-2/description/题目:Givenaninteger n,return abinarystringrepresentingitsrepresentationinbase -2.Note thatthereturnedstringshouldnothaveleadingzerosunlessthestringis "0".......
  • springboot演唱会门票管理系统-计算机毕业设计源码15070
    基于微信小程序的演唱会门票管理系统摘 要本文介绍的是基于Spring Boot开发的演唱会门票管理系统。该系统旨在为用户提供一个便捷、高效的平台,以实现演唱会门票的购买和退票功能。随着社交媒体和互联网的普及,传统的演唱会门票购买方式存在过程繁琐、数据统计困难等问题。......
  • LeetCode | 370 RangeAddition
    https://github.com/dolphinmind/datastructure/tree/datastructure-array-02分析数组本身的递归性,差分数组的不变性和可逆性,在left索引上对当前及后续所有元素产生影响,在right+1索引上进行反操作,消除这种影响,再进行还原即可数组本身具有递归性差分数组性质:对于任何常数c......
  • LeetCode 热题 HOT 100 (015/100)【宇宙最简单版】
    【栈】No.0155最小栈【中等】......
  • leetcode 2181.合并零之间的结点
    1.题目要求:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*mergeNodes(structListNode*head){structListNode*cur=head;intcount=0;//1.遍历结......
  • leetcode 2181.合并零之间的结点
    1.题目要求:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*mergeNodes(structListNode*head){structListNode*cur=head;intcount=0;//1.遍历结......