普通数组

1. 53. 最大子数组和

动态规划

首先需要知道的是,之所以使用dp是因为当前有两种选择,要么之前的总和拖累了当前,只选择当前。要么之前的总和加当前

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp = [0]*len(nums)
ans = 0
for i in range(len(nums)):
if i == 0:
dp[i] = nums[i]
else:
dp[i] = max(nums[i], nums[i]+dp[i-1])

return max(dp)

2. 56. 合并区间

数组操作

记得先排序

在ans中操作,不要操作完了再传入ans

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals = sorted(intervals)
ans = []
ans.append(intervals[0])

for i in range(1, len(intervals)):
if intervals[i][0] > ans[-1][1]:
ans.append(intervals[i])
else:
ans[-1][1] = max(ans[-1][1], intervals[i][1])

return ans

3. 189. 轮转数组

三步反转法!!!

  1. 反转整个数组
  2. 反转前k个元素
  3. 反转后n-k个元素

需要注意k可能比n大的多的多的多,所以需要取余,即k % n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def rotate(self, nums: list[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
def reverse(i, j):
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1

k = k % len(nums)

# 1
reverse(0, len(nums)-1)
# 2
reverse(0, k-1)
# 3
reverse(k, len(nums)-1)

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

前缀🐔

注意两个前缀🐔是从左到右和从右到左即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
n = len(nums)
left_prex, right_prex, ans = [1] * n, [1] * n, [1] * n

for i in range(n):
if i == 0:
left_prex[i] = 1
else:
left_prex[i] = left_prex[i-1] * nums[i-1]

for i in range(n-1, -1, -1):
if i == n-1:
right_prex[i] = 1
else:
right_prex[i] = right_prex[i+1] * nums[i+1]

for i in range(n):
ans[i] = left_prex[i] * right_prex[i]

return ans

5. 41. 缺失的第一个正数

原地哈希

这题说难难,说简单也简单,将数组下标与值做一个映射(i-1<->nums[i]),不过在判断移位时

  1. 在判断中需要满足两个条件,第一个是在数组长度之内,第二个如果需要置换,两个不能相同
  2. 需要一个tmp,一行写不行
  3. 都满足返回一个n+1不要忘了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
n = len(nums)
for i in range(n):
# 1
while 1 <= nums[i] <= n and nums[i] != nums[nums[i]-1]:
# 2
j = nums[i]-1
nums[i], nums[j] = nums[j], nums[i]


for i in range(n):
if i+1 != nums[i]:
return i+1
# 3
return n+1

站内搜索

没有找到内容!