##LC977 有序数组的平方
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
i = 0
j = len(nums)-1
a = [0]*len(nums)
cnt = len(nums)-1
while i <=j:
if nums[i]*nums[i] > nums[j]*nums[j]:
a[cnt] = nums[i]*nums[i]
i = i+1
cnt = cnt -1
else:
a[cnt] = nums[j]*nums[j]
j = j-1
cnt = cnt-1
return a
- 可以直接用暴力法解决这一个问题,将数组各数字进行平方后直接进行排序,O(logn),不符合进阶条件。
- 使用双指针法,是数组题目中常见的操作,双指针有两种指法:一种由中间向两边扩散,一方到头后另一方完全填入,正向append进提前准备的数组。另一种由两边向中间指,其判断条件以及循环过程明显好于第一种,建议使用。
##LC209 长度最小的子数组
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
i = 0
j = 0
cur_sum = 0
mins = len(nums)
while j < len(nums):
cur_sum += nums[j]
if cur_sum < target:
# cur_sum += nums[j]
j += 1
else:
# mins = min(j-i+1,mins)
if j-i+1<mins:
mins = j-i+1
cur_sum -= nums[i]
i += 1
cur_sum -= nums[j]
if i==0 and j ==len(nums):
return 0
if mins ==1:
return 1
return mins
滑动窗口方法
##LC59 螺旋矩阵 II
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 = 1
tar = n*n
while num <= tar :
for i in range(l,r+1):
mat[t][i] = num
num += 1
t = t + 1
for i in range(t,b+1):
mat[i][r] = num
num += 1
r = r-1
for i in range(r,l-1,-1):
mat[b][i] = num
num += 1
b = b-1
for i in range(b,t-1,-1):
mat[i][l] = num
num += 1
l += 1
return mat
纯正的模拟题目 很有意思,有两种写法,一种是上面那种分上下左右,然后以填入的数字个数记录,另一种用循环次数以及偏移量记录,需要多加练习。