一、189.轮转数组
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. 除自身以外数组的乘积
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.缺失的第一个正数
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
560

被折叠的 条评论
为什么被折叠?



