Top 100 Linked Question 修炼------第238题、第239题

博客主要分析了LeetCode 238和239题。238题要求返回数组中除当前元素外所有元素之积,不能用除法且时间复杂度为O(n);239题是给定数组和滑动窗口大小,返回最大滑动窗口。文中给出了两题的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

238. Product of Array Except Self

题目链接

题目解释:给出一个含有n个整数的数组(n>1),返回这样一个数组:数组中的元素为除可当前角标的元素外的所有元素之积。

Example:

Input:  
[1,2,3,4]

Output: 
[24,12,8,6]

注意:解决这个问题的时候不能采用除法,并且时间复杂度需要为O(n).

更进一步:你能否使用常数个空间来解决呢(输出的输入不被计算为额外的空间)。

题目分析:首先能够想到最简单的方法就是求出所有元素的乘积,然后将所得的乘积除以原本元素中的当前元素,这样就很容易得到最后的output数组了。但是,很显然,题目一开始就禁止了我们采用除法这个手段。只能是另辟蹊径了。

我们还是可以申请大小为 n 的空间 result 用于返回结果,由于题目要求不能出现除运算,所以本题的基本思路是:

1. 申请两个大小为 n 的数组

2. 第一个数组的第 i 个元素存储第0个到第 i-1 个元素的乘积

3. 第二个数组的第 i 个元素存储第 i+1 到最后一个元素的乘积

4. 然后将两个数组的元素"交叉相乘"即可得到最后的结果

    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        # 先给两个数组进行初始化值
        dp1 = [1]
        dp2 = [1]
        for i in range(len(nums) - 1):
            dp1.append(dp1[i] * nums[i])
            dp2.append(dp2[i] * nums[-i - 1])

        output = []
        # 对两个数组进行交叉相乘
        for i in range(len(dp1)):
            output.append(dp1[i] * dp2[-i - 1])
        return output

239. Sliding Window Maximum

题目链接

题目解释:给定一个数组nums,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。 您只能在窗口中看到k个数。 每次滑动窗口向右移动一个位置。 返回最大滑动窗口。

Example:

Input: nums = 
[1,3,-1,-3,5,3,6,7]
, and k = 3
Output: 
[3,3,5,5,6,7] 
Explanation: 

Window position                Max
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

Note: 

假设k是有效的,即1≤k≤输入数组的长度。

更进一步:
你能在线性时间内得到最终的结果么?

题目分析:既然题目已经说明了使用滑窗法来解决问题,那么我们直接就是采用移动窗口来解决问题。

    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        if k>len(nums):
            return []
        if not nums:
            return []
        res=[]
        i=0
        while (i+k)<len(nums)+1:
            res.append(max(nums[i:i+k]))
            i+=1
        return res

总结

2019/5/23:准备考试的一周,心慌慌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值