题目链接:https://leetcode.com/problems/squares-of-a-sorted-array/
leetcode 977
讲解链接:代码随想录
看到题目的第一思路:
感觉可以用先平方后排序的思路 所以尝试了暴力解法
代码随想录之后的想法和总结:
通过“数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。”
理解了怎样以及何时用双指针方法在这个题目里:通过从最大到最小 倒着更新数组下标的方式来排序和更新数组,以及两个指针从外向内 比较每个元素平方后的大小 如果最大 就放到数组最后一位,然后移动指针,比较出次大,放进数组,以此类推
遇到的困难:
暂无
本题代码解法:
#双指针解法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l, r, i = 0, len(nums)-1, len(nums)-1
res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
while l<=r:
if nums[l]**2 < nums[r]**2:#左右边界进行对比,找出最大值
res[i]=nums[r]**2
r-=1 ## 右指针往左移动
else:
res[i]=nums[l]**2
l+=1# 左指针往右移动
i-=1 # 存放结果的指针需要往前平移一位
return res
题目链接:https://leetcode.com/problems/minimum-size-subarray-sum/
leetoce 209
讲解链接:
看到题目的第一思路:
暂无
代码随想录之后的想法和总结:
了解了滑动窗口(另一种形式的双指针)
“窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
解题的精髓:窗口的起始位置如何移动(不断变更i)”-代码随想录
遇到的困难:
读懂以及了解滑动窗口有一定难度
“不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。”
本题代码解法:
1 暴力解法
#暴力解法
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
min_len = float('inf')#定义最小子序列的长度方便之后比较选出
for i in range(l):
cur_sum = 0 #子序列的数值之和
for j in range(i,l):
cur_sum = cur_sum + nums[j] #calculating the sum of the subarray from index i to j
if cur_sum >= s:
min_len = min(min_len, j-i +1 )
#j-i + 1在取当前子序列的长度,然后和之前的最小子序列做对比,找到最小子序列
break #找到了最小子序列,所以break
#返回找到的最小子序列,如果没有找到就返回0
return min_len if min_len != float('inf') else 0
2 滑动窗口法
找到一定长度的子串之后就不用考虑比它更长的子串了,因此可以用滑动窗口省略掉大部分情况
#滑动窗口法
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
left = 0
right = 0
min_len = float('inf')
cur_sum = 0 #当前的累加值
while right < l:
cur_sum += nums[right] #计算本次循环的累加值
while cur_sum >= s: # 当前累加值大于目标值
min_len = min(min_len, right - left + 1)#计算当前子序列长度
cur_sum -= nums[left] #因为已经满足要求,看能不能删掉起始位置来缩小长度
left += 1 #窗口缩小
right += 1 #如果缩小窗口无法满足要求,那么终止位置后移
return min_len if min_len != float('inf') else 0 #返回最小数组长度
题目链接:
leetcode 59
https://leetcode.com/problems/spiral-matrix-ii/
讲解链接:代码随想录
看到题目的第一思路:
理解题目要求花了一些时间,第一次做类似的题目
代码随想录之后的想法和总结:
这道题是看了评论区的题解,明白了题目的用意以及需要怎样的思维方式
下图来自此题解
遇到的困难:
1 range function使用要牢记,含前不含后
2 关于python 二维数组的创建:
列表生成式法:
test = [[0 for i in range(m)] for j in range(n)]
关于二维数组:
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,二维数组又称为矩阵,行列数相等的矩阵称为方阵。
本题代码解法:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
l,r,t,b = 0,n-1, 0, n-1
mat = [[0 for _ in range(n)] for _ in range(n)]
num, tar = 1, n*n
while num <= tar:
for i in range(l, r+1):
#left to right, 此处注意range function 使用,不包含最后一个元素
mat[t][i] = num
#此处像坐标一样对应每个二维数组
num += 1
t += 1
for i in range(t, b+1): #top to bottom
mat[i][r] = num
num += 1
r -= 1
for i in range(r,l-1,-1):#right to left
mat[b][i] = num
num += 1
b -= 1
for i in range (b , t-1, -1):#bottom to top
mat[i][l] = num
num += 1
l += 1
return mat
今日收获,学习时长:
3days
因为209滑动窗口比较难,有遇到困难卡住的情况,之后可以重点复习此题
另有矩阵相关题目第一次做,需练习思维
数组专题总结:(array)
数组是存放在连续内存空间上的相同类型数据的集合。
要注意的几点:
1 数组的下标都是从0开始
2 数组内存空间的地址是连续的
3 range in array-不包含最后一位数字-(0,range-1)