HOT 100 | 189.轮转数组、238. 除自身以外数组的乘积、41. 缺失的第一个正数
一、189.轮转数组
189. 轮转数组 - 力扣(LeetCode)
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 += 1j -= 1n = len(nums)k %= nreverse(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] * nfor i in range(1, n):pre[i] = pre[i-1]*nums[i-1]suf = [1] * nfor 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]-1nums[i],nums[j] = nums[j],nums[i]for i in range(n):if nums[i]!=i+1:return i+1return n+1