- 今日学习的文章链接,或者视频链接
- 自己看到题目的第一想法
977:
1.暴力解法:先平方,再排序,光排序就O(nlogn),肯定超时
2.联想到插入排序,先平方,再插入到数列中,O(n^2)
3.知道要用双指针,但不知道应该怎么用
209:
暴力解法:找出所有满足条件的子数组,返回长度最小的子数组的长度
59:
没思路
- 看完代码随想录之后的想法
977:
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
联想到quick sort的partition,O(n)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
start = 0
end = len(nums) - 1
result = [0] * len(nums)
k = len(nums) - 1
while start <= end and k>=0:
if nums[start]**2 < nums[end]**2:
result[k] = nums[end]**2
k -= 1
end -= 1
elif nums[start]**2 > nums[end]**2:
result[k] = nums[start]**2
k -= 1
start += 1
else:
result[k] = nums[start]**2
k -= 1
start += 1
return result
209:
滑动窗口,关键是起始位置的移动
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
result = float('inf')
sum = 0
i = 0
subLength = 0
for j in range(len(nums)):
sum +=nums[j]
while sum >= target:
subLength = j - i + 1
result = min(result, subLength)
sum -= nums[i]
i += 1
return 0 if result == float('inf') else result
59:
循环不变量
左闭右开
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res = [[0] * n for _ in range(n)]
startx, starty = 0, 0
loop = n // 2
mid = n // 2
count = 1
offset = 1
i, j = 0, 0
while loop:
i, j = startx, starty
for j in range(starty, n - offset):
res[startx][j] = count
count += 1
j += 1
for i in range(startx , n - offset):
res[i][j] = count
count += 1
i += 1
while j > starty:
res[i][j] = count
count += 1
j -= 1
while i > startx:
res[i][j] = count
count += 1
i -= 1
startx += 1
starty += 1
offset += 1
loop -= 1
if n % 2:
res[mid][mid] = count
return res
- 自己实现过程中遇到哪些困难
977:
if elif与if if的区别没有深刻理解,导致程序出错
209:
滑动窗口第一次写还不熟练
59:
边界条件的处理
- 今日收获,记录一下自己的学习时长
双指针
滑动窗口