Day 2 双指针 长度最小的子数组 螺旋矩阵II

977.有序数组的平方 ,209.长度最小的子数组 ,

Tasks

977.有序数组的平方

题目建议: 本题关键在于理解双指针思想

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

59.螺旋矩阵II

题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

总结
题目建议:希望大家 也做一个自己 对数组专题的总结

文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E6%80%BB%E7%BB%93%E7%AF%87.html

Individual assignment

977 暴力求解(Violent solution)

def sortedSquares(A):
    A = [x**2 for x in A]
    A.sort()
    return A

# 提示用户输入数据
input_str = input("请输入一系列整数,用逗号分隔: ")

# 将输入的字符串转换为整数列表
# 先使用 split(',') 根据逗号分隔字符串,然后使用列表推导式将每个部分转换为整数
numbers = [int(x) for x in input_str.split(',')]

# 调用函数并打印结果
print("平方后排序的结果是:", sortedSquares(numbers))

双指针(https://algo.itcharge.cn/01.Array/04.Array-Two-Pointers/01.Array-Two-Pointers/)【转载】

在这里插入图片描述

2.2 模版

left, right = 0, len(nums) - 1

while left < right:
    if 满足要求的特殊条件:
        return 符合条件的值 
    elif 一定条件 1:
        left += 1
    elif 一定条件 2:
        right -= 1

return 没找到 或 找到对应值

2.3 对撞指针适用范围

对撞指针一般用来解决有序数组或者字符串问题:

查找有序数组中满足某些约束条件的一组元素问题:比如二分查找(day1)、数字之和等问题。
字符串反转问题:反转字符串、回文数、颠倒二进制等问题。
下面我们根据具体例子来讲解如何使用对撞指针来解决问题。

977.有序数组的平方

class Solution:
    def sortedSquares(self,A : List[int]):
        A = [x**2 for x in A]
        A.sort()
        return A

在这里插入图片描述
209.长度最小的子数组

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:

        n=len(nums)
        ans=n+1
        i,j=0,0
        T=0
        while j<n:
            T+=nums[j]
            while T>=target:
                ans=min(ans,j-i+1)
                T-=nums[i]
                i+=1
            j+=1
    
        return 0 if ans == n+1 else ans#一定注意ans==n+1

59.螺旋矩阵II

# 59. 螺旋矩阵 II
class Solution(object):
    def generateMatrix(self, n):
        matrix = [[0 for i in range(n)] for j in range(n)]
        #初始化全0矩阵用来填数字
        
        record = []
        record.append(n)
        for i in range(n-1, 0, -1):
            record.append(i)
            record.append(i)
        #record是走的步数,矩阵为6*6的话,record就是:6 5 5 4 4 3 3 2 2 1 1

        forward = [
            [0, 1],
            [1, 0],
            [0, -1],
            [-1, 0]
        ]
        flag = 0
        #我们用flag(0,1,2,3,0,1,2,3循环)配合forward(方向矩阵)来走步数
        
        number = 0
        #要填的数字
        
        x = 0
        y = -1
        #初始位置,我是从矩阵第一排第一个左上角数字,再往左一个位置开始走的(-1, 0)
        #注意计算机里的二维矩阵,第一个维度是排,第二个维度是列
            
        for i in record:#遍历record步数矩阵,每走到固定步数换方向
            for step in range(i):#6*6矩阵第一个方向走6步,所以这时候i是6,step从0到5变化
                x += forward[flag][0]
                y += forward[flag][1]
                #x,y分别前进对应的方向
                
                number += 1
                matrix[x][y] = number
                #在matrix[x][y]写入我们要写的数字,数字每次写前自增1
                
            flag += 1
            flag %= 4
            #record的第一个步数i走完,该换方向了,取模%为了循环
        return matrix

A = Solution()
A.generateMatrix(6)
# 59. 螺旋矩阵 II
class Solution(object):
    def generateMatrix(self, n):
        matrix = [[0 for i in range(n)] for j in range(n)]
        #初始化全0矩阵用来填数字
        
        record = []
        record.append(n)
        for i in range(n-1, 0, -1):
            record.append(i)
            record.append(i)
        #record是走的步数,矩阵为6*6的话,record就是:6 5 5 4 4 3 3 2 2 1 1

        forward = [
            [0, 1],
            [1, 0],
            [0, -1],
            [-1, 0]
        ]
        flag = 0
        #我们用flag(0,1,2,3,0,1,2,3循环)配合forward(方向矩阵)来走步数
        
        number = 0
        #要填的数字
        
        x = 0
        y = -1
        #初始位置,我是从矩阵第一排第一个左上角数字,再往左一个位置开始走的(-1, 0)
        #注意计算机里的二维矩阵,第一个维度是排,第二个维度是列
            
        for i in record:#遍历record步数矩阵,每走到固定步数换方向
            for step in range(i):#6*6矩阵第一个方向走6步,所以这时候i是6,step从0到5变化
                x += forward[flag][0]
                y += forward[flag][1]
                #x,y分别前进对应的方向
                
                number += 1
                matrix[x][y] = number
                #在matrix[x][y]写入我们要写的数字,数字每次写前自增1
                
            flag += 1
            flag %= 4
            #record的第一个步数i走完,该换方向了,取模%为了循环
        return matrix

A = Solution()
A.generateMatrix(6)
  • 32
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值