HOT 100 | 189.轮转数组、238. 除自身以外数组的乘积、41. 缺失的第一个正数

一、189.轮转数组

189. 轮转数组 - 力扣(LeetCode)

1. 解题思路

HOT 100 | 189.轮转数组、238. 除自身以外数组的乘积、41. 缺失的第一个正数_第1张图片

1. 由于k可能很大,为了防止多次重复挪动,所以只需要对其取余,就是最终挪动的位置。

2. 自定义一个翻转函数reverse,传入起始位置,然后交换元素即可。

3. 调用翻转函数,首先进行整体翻转,然后对前K个和后K个进行翻转就是最后的结果。

2. 代码实现

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        def reverse(i: int, j: int) -> None:
            while i < j:
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
                j -= 1
        n = len(nums)
        k %= n
        reverse(0, n-1)
        reverse(0, k-1)
        reverse(k, n-1)

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

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

1. 解题思路

        answer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积。换句话说,如果知道了 i 左边所有数的乘积,以及 i 右边所有数的乘积,就可以算出 answer[i]。所以基本的解题思路是,先计算出前缀积,再计算出后缀积,然后对应相乘就是最后的结果。

        1. 定义 pre[i] 表示从 nums[0] 到 nums[i−1] 的乘积。定义 suf[i] 表示从 nums[i+1] 到 nums[n−1] 的乘积。
        2. 可以先计算出从 nums[0] 到 nums[i−2] 的乘积 pre[i−1],再乘上 nums[i−1],就得到了 pre[i],即:pre[i]=pre[i−1]⋅nums[i−1];同理有:suf[i]=suf[i+1]⋅nums[i+1]。

        初始值:pre[0]=suf[n−1]=1。按照定义,pre[0] 和 suf[n−1] 都是空子数组的元素乘积,我们规定这是 1,因为 1 乘以任何数 x 都等于 x,这样可以方便递推计算 pre[1],suf[n−2] 等。

        3. 算出 pre 数组和 suf 数组后,有:answer[i]=pre[i]⋅suf[i]。

2. 代码实现

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n = len(nums)
        pre = [1] * n
        for i in range(1, n):
            pre[i] = pre[i-1]*nums[i-1]
        
        suf = [1] * n
        for i in range(n-2, -1, -1):
            suf[i] = suf[i+1] * nums[i+1]
        return [s* p for s, p in zip(pre,suf)]

三、41.缺失的第一个正数

41. 缺失的第一个正数 - 力扣(LeetCode)

1. 解题思路

        1. 由于时间复杂度的限制不能额外拓展一个新数组,所以首先将所有元素放在对应的位置上,也就是遍历数组,然后两两进行交换位置。

        2. 找到第一个不匹配的元素就是缺失的第一个正数。

        3. 如果都没有找到,说明元素都在自己正确的位置,直接返回数组长度+1即可。

2. 代码实现

class Solution:
    def firstMissingPositive(self, nums:List[int])->int:
        n = len(nums)
        for i in range(n):
            while 1<=nums[i]<=n and nums[i] != nums[nums[i]-1]:
                j = nums[i]-1
                nums[i],nums[j] = nums[j],nums[i]
        for i in range(n):
            if nums[i]!=i+1:
                return i+1
        return n+1
       

你可能感兴趣的:(python,算法,leetcode)