目录
977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
解题思路:
第一种:暴力穷举法
先循环得出有序数组的平方,然后进行数组排序
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
nums2 = []
for i in range(len(nums)):
a = nums[i] * nums[i]
nums2.append(a)
nums2.sort() # 排序
return nums2
"""
nums = [0,6,-5,10]
nums2 = [0,25,36,100]
"""
第二种方法:双指针法
新建一个数组,快指针循环得出数组的平方
慢指针根据有序数组的性质进行数组排序
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
n = len(nums)
result = [-1] * n
i = 0
j = len(nums) - 1
k = len(nums) - 1
while i<=j:
a = nums[i] * nums[i]
b = nums[j] * nums[j]
if a < b:
result[k] = b
j = j - 1
else:
result[k] = a
i = i + 1
k = k - 1
return result
209.长度最小的子数组
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
题目:给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
解题思路:利用滑动窗口法
- 定义:不断的调节子序列的起始位置和终止位置,从而得出结果
- 方法:采用单个循环来完成滑动窗口,注意for循环表示的是终止位置
- 注意:一定要先设定一个数组长度的最大值,这样才可以进行长度最小值的更新。
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
sum = 0
i = 0
result = float('inf') # 最大值
for j in range(len(nums)):
sum = sum + nums[j]
while sum >= target:
n = j - i + 1
result = min(result,n)
sum = sum - nums[i]
i = i + 1
return result if result != float('inf') else 0
59.螺旋矩阵II
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
题目:给你一个正整数 n
,生成一个包含 1
到 n^2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
解题思路:处理规则统一,循环不变量原则.
一个矩阵如图所示,一圈下来就包含了四条边,我们对每条边的定义不一样,但是可以定义每条边的循环规则.
注意:一定要注意四条边的取值范围,每条边的取值范围都是动态的,因为循环有时不是一圈,所以要注意一下小细节。
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
s_x = 0
s_y = 0
offset = 1 # 偏移量
count = 1
nums = [[0] * n for _ in range(n)]
loop, mid = n // 2, n // 2
for offset in range(1, loop + 1):
# 第一条边
for j in range(s_y,n-offset):
nums[s_x][j] = count
count += 1
# 第二条边
for i in range(s_x,n-offset):
nums[i][n-offset] = count
count += 1
# 第三条边
for j in range(n - offset,s_y,-1):
nums[n - offset][j] = count
count += 1
# 第四条边
for i in range(n - offset,s_x,-1):
nums[i][s_y] = count
count += 1
s_x += 1
s_y += 1
offset += 1
# n 为奇数时剩下的中心点
if n % 2 == 1:
nums[mid][mid] = count
return nums