数组算法题
# 练习题
# 1.移除元素 (opens new window)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums) -1
left, right = 0, n
while left <= right:
if nums[left] == val:
while left<= right <= n:
if nums[right] !=val:
nums[left], nums[right] = nums[right], nums[left]
print(left, right, nums)
break
else:
nums.pop()
right -= 1
left += 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums)
left, right = 0, 0
while right<n:
if nums[right] != val:
nums[left] = nums[right]
left += 1
right += 1
return left
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
func removeElement(nums []int, val int) int {
// if len(nums) == 1 && nums[0] != val{
// return 1
// }
left := 0
for right:=0;right<len(nums);right++{
if nums[right]!= val{
nums[left] = nums[right]
left ++
}
}
return left
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
// Make sure to add code blocks to your code group
# 2.螺旋矩阵 II (opens new window)
给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
1
2示例 2:
输入:n = 1 输出:[[1]]
1
2提示:
1 <= n <= 20
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
left, right ,top, bottom = 0, n-1, 0, n-1
result = list()
board = [["-"] * n for _ in range(n)]
start = 1
while left <= right and top<= bottom:
for col in range(left, right+1):
print(col)
# result.append(start)
board[top][col] = start
start += 1
for row in range(top+1, bottom):
# result.append(start)
board[row][right] = start
start += 1
if left < right:
for col in range(right, left, -1):
# result.append(start)
board[bottom][col] = start
start += 1
if top < bottom:
for row in range(bottom, top, -1):
# result.append(start)
board[row][left] = start
start += 1
left += 1
right -= 1
top += 1
bottom -= 1
return board
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1
// Make sure to add code blocks to your code group
# 3.长度最小的子数组 (opens new window)
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回0
。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
1
2
3示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
1
2示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
1
2
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
"""
滑动窗口
"""
n = len(nums)
left, right = 0, 0
min_len = n+1
total = 0
while left <= right< n:
total += nums[right]
while left <= right and total>= target:
min_len = min(right- left +1, min_len)
print(min_len, right, left)
total -= nums[left]
left += 1
right +=1
return 0 if min_len == n+1 else min_len
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
// Make sure to add code blocks to your code group
# 4.有序数组的平方 (opens new window)
给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
1
2
3
4示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
1
2提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
笔记
平方后,两头大中间小的特性,不断向中间逼近,将结果添加在头部
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
"""
可以平方后归并排序
这里采用双指针的方式
"""
left, right, result = 0, len(nums)-1, []
while left <= right:
if nums[left] ** 2 < nums[right] ** 2:
result.insert(0, nums[right]**2)
right -= 1
else:
result.insert(0, nums[left]**2)
left += 1
return result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
# 分情况讨论
neg = []
non_neg = []
for num in nums:
if num < 0:
neg.append(num * num)
else:
non_neg.append(num * num)
neg.reverse()
# 合并有序列表
m, n = len(neg), len(non_neg)
i = j = 0
ans = []
while i < m and j < n:
if neg[i] < non_neg[j]:
ans.append(neg[i])
i += 1
else:
ans.append(non_neg[j])
j += 1
ans += neg[i:]
ans += non_neg[j:]
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
// Make sure to add code blocks to your code group
编辑 (opens new window)
上次更新: 2024/12/31 14:23:38