第二天
题目:
难度简单
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
记录:
要求时间复杂度 O(n)
的,又是双指针
from typing import List
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
right = len(nums) - 1 # 注意边界
left = 0
k = len(nums)
result = [0] * k
while right >= left: # 谁大就取谁,小的留在原地接着比
if nums[right] ** 2 >= nums[left] ** 2:
result[k - 1] = nums[right] ** 2
right -= 1
k -= 1
else:
result[k - 1] = nums[left] ** 2
left += 1
k -= 1
return result
n = [int(x) for x in input().split(",")]
print(Solution().sortedSquares(n))
第一时间还没想出来,总想从中间向两边出发。
看了眼代码随想录的思路反应过来,从两边向中间走就好了。
题目:
难度中等
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。#注意连续指的是下标连续
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
进阶:
- 如果你已经实现
O(n)
时间复杂度的解法, 请尝试设计一个O(n log(n))
时间复杂度的解法。
记录:
这是做过一次的题了,但当时没太理解
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0 # 左边界
s = 0 # 窗口内的和
ans = len(nums)+1 # 用数组长度初始化最小子数组长度
for right, x in enumerate(nums): # enumerate返回元素和下标
s += x # 求和
print("s="+str(s))
while s >= target: # 要用while,符合条件时左边界一直移动
ans = min(ans, right - left + 1) # ans取更短的子数组长度
s -= nums[left] # 先减去左边界元素,左边界再右移
left += 1
print("ans=" + str(ans))
print("s=" + str(s))
print("left=" + str(left))
if ans <= len(nums):
return ans
else:
return 0
z = int(input())
n = [int(x) for x in input().split(",")]
print(Solution().minSubArrayLen(z, n))
第二次还是没当面自己撕出来,不过这次好像理解滑动窗口了。
题目:
难度中等
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
提示:
1 <= n <= 20
记录:
from typing import List
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
matrix = [[0 for _ in range(n)] for _ in range(n)]
i = 1
j = -1
k = 0
count = 0 # 记录已填充的位置数
while count < n * n:
while j < n - 1 and matrix[k][j + 1] == 0:
j += 1
matrix[k][j] = i
i += 1
count += 1
while k < n - 1 and matrix[k + 1][j] == 0:
k += 1
matrix[k][j] = i
i += 1
count += 1
while j > 0 and matrix[k][j - 1] == 0:
j -= 1
matrix[k][j] = i
i += 1
count += 1
while k > 0 and matrix[k - 1][j] == 0:
k -= 1
matrix[k][j] = i
i += 1
count += 1
return matrix
x = int(input())
print(Solution().generateMatrix(x))
边界条件太绕了,快改吐了
虽然这个代码过了,但是有ChatGPT帮我改过,我忏悔。