用python写leetcode【8】 --除自身以外数组的乘积(238)、最小栈(155)

除自身以外数组的乘积(238)

题目

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

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

思路

如果可以用除法,那本题非常简单,在判断0是否存在的前提上每一个数要么是0要么是非零数相乘后除以当前数。但是不可以用乘法那就得用如下的思路。
创造两个数组,分别是从左别累乘和从右边累乘,之后对每个输出,在这两个数组中找相应的值相乘。

代码

class Solution:
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        n = len(nums)
        ret = [1 for _ in range(n)]
        
        # 从左边开始乘一遍
        left = 1
        for i in range(n):
            ret[i] *= left
            left *= nums[i]
        
        # 从右边乘一遍
        right = 1
        for j in range(n-1, -1, -1):
            ret[j] *= right
            right *= nums[j]
        
        return ret

最小栈(155)

题目

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

思路

没什么难度,见代码。

代码

class MinStack:

def __init__(self):
    """
    initialize your data structure here.
    """
    self.stack = []
    self.min = None

def push(self, x):
    """
    :type x: int
    :rtype: void
    """
    self.stack.append(x)
    if self.min == None or self.min > x:
        self.min = x

def pop(self):
    """
    :rtype: void
    """
    popItem = self.stack.pop()
    if len(self.stack) == 0:
        self.min = None
        return popItem
    
    if popItem == self.min:
        self.min = self.stack[0]
        for i in self.stack:
            if i < self.min:
                self.min = i
    return popItem

def top(self):
    """
    :rtype: int
    """
    return self.stack[-1]

def getMin(self):
    """
    :rtype: int
    """
    return self.min
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值