02天【代码随想录算法训练营34期】 第一章 数组part02 ( 977.有序数组的平方 、209.长度最小的子数组、 59.螺旋矩阵II)

977.有序数组的平方
暴力解法,熟悉python的array.sort()用法

  • 可以再温习一下不同sort的算法写法以及complexity
class Solution(object):
    def sortedSquares(self, nums):
        for i in range(len(nums)):
            nums[i] = nums[i] ** 2
        nums.sort()
        return nums

双指针解法

class Solution(object):
    def sortedSquares(self, nums):
        left_ptr = 0
        right_ptr = len(nums) - 1
        result = [0] * len(nums)
        write_ptr = len(nums) - 1
        left_sqr = nums[left_ptr] ** 2
        right_sqr = nums[right_ptr] ** 2
        while write_ptr >= 0:
            if left_sqr > right_sqr:
                result[write_ptr] = left_sqr
                left_ptr += 1
                left_sqr = nums[left_ptr] ** 2
            else:
                result[write_ptr] = right_sqr
                right_ptr -= 1
                right_sqr = nums[right_ptr] ** 2
            write_ptr -= 1
        return result

209.长度最小的子数组
滑动窗口,也属于双指针,窗口右边递增,每次递增遍历一下窗口左边递增的情况

class Solution(object):
    def minSubArrayLen(self, target, nums):
        window_start = 0
        min_size = float('inf')
        summation = 0
        for window_end, number in enumerate(nums):
            summation += number
            while summation >= target:
                min_size = min(min_size, window_end - window_start + 1)
                summation -= nums[window_start]
                window_start += 1
        if min_size == float('inf'):
            return 0
        else:
            return min_size

59.螺旋矩阵II

怎么决定转几圈?把矩阵上下割开,有几层就转几圈

class Solution(object):
    def generateMatrix(self, n):
        startx, starty = 0, 0 #每一圈的初始点
        matrix = [[0] * n for _ in range(n)] #做个矩形框框出来
        layer = 1 #第几圈
        count = 1 #数数
        mid = n // 2 #一共转几圈
        for k in range(mid): 
            for j in range(starty, n - layer): #从左上到右上的前一格
                matrix[startx][j] = count
                count += 1
            for i in range(startx, n - layer): #从右上到右下的前一格
                matrix[i][n - layer] = count
                count += 1
            for j in range(n - layer, starty,-1): #从右下到左下的前一格
                matrix[n - layer][j] = count
                count += 1
            for i in range(n - layer, startx, -1): #从左下到左上的前一格子
                matrix[i][starty] = count
                count += 1
            startx += 1
            starty += 1
            layer += 1
        if n % 2 != 0: #如果n为奇数的话,中间会留个芯,填进去
            matrix[mid][mid] = count
        return matrix
posted @ 2024-03-21 13:51  MiraMira  阅读(14)  评论(0)    收藏  举报