刷题训练营第二天补卡

题目链接:https://leetcode.com/problems/squares-of-a-sorted-array/

leetcode 977

讲解链接:代码随想录

看到题目的第一思路:

感觉可以用先平方后排序的思路 所以尝试了暴力解法

代码随想录之后的想法和总结:

通过“数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

此时可以考虑双指针法了,i指向起始位置,j指向终止位置。”

理解了怎样以及何时用双指针方法在这个题目里:通过从最大到最小 倒着更新数组下标的方式来排序和更新数组,以及两个指针从外向内 比较每个元素平方后的大小 如果最大 就放到数组最后一位,然后移动指针,比较出次大,放进数组,以此类推

遇到的困难:

暂无

本题代码解法:

#双指针解法
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l, r, i = 0, len(nums)-1, len(nums)-1
        res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
        while l<=r:
            if nums[l]**2 < nums[r]**2:#左右边界进行对比,找出最大值
                res[i]=nums[r]**2
                r-=1 ## 右指针往左移动
            else:
                res[i]=nums[l]**2
                l+=1# 左指针往右移动
            i-=1 # 存放结果的指针需要往前平移一位
        return res

        


题目链接:https://leetcode.com/problems/minimum-size-subarray-sum/

leetoce 209

讲解链接:

代码随想录

看到题目的第一思路:

暂无

代码随想录之后的想法和总结:

了解了滑动窗口(另一种形式的双指针)

“窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

解题的精髓:窗口的起始位置如何移动(不断变更i)”-代码随想录

遇到的困难:

读懂以及了解滑动窗口有一定难度

不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。”

本题代码解法:

1 暴力解法

#暴力解法
class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = len(nums)
        min_len = float('inf')#定义最小子序列的长度方便之后比较选出

        for i in range(l):
            cur_sum = 0 #子序列的数值之和
            for j in range(i,l):
                cur_sum = cur_sum + nums[j] #calculating the sum of the subarray from index i to j
                if cur_sum >= s:
                    min_len = min(min_len, j-i +1 )
                    #j-i + 1在取当前子序列的长度,然后和之前的最小子序列做对比,找到最小子序列
                    break #找到了最小子序列,所以break

        #返回找到的最小子序列,如果没有找到就返回0
        return min_len if min_len != float('inf') else 0 


       

2 滑动窗口法

找到一定长度的子串之后就不用考虑比它更长的子串了,因此可以用滑动窗口省略掉大部分情况

#滑动窗口法
class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = len(nums)
        left = 0
        right = 0
        min_len = float('inf')
        cur_sum = 0 #当前的累加值
        
        while right < l:
            cur_sum += nums[right] #计算本次循环的累加值
            
            while cur_sum >= s: # 当前累加值大于目标值
                min_len = min(min_len, right - left + 1)#计算当前子序列长度
                cur_sum -= nums[left] #因为已经满足要求,看能不能删掉起始位置来缩小长度
                left += 1 #窗口缩小
            
            right += 1 #如果缩小窗口无法满足要求,那么终止位置后移
        
        return min_len if min_len != float('inf') else 0 #返回最小数组长度

题目链接:

leetcode 59

https://leetcode.com/problems/spiral-matrix-ii/

讲解链接:代码随想录

看到题目的第一思路:

理解题目要求花了一些时间,第一次做类似的题目

代码随想录之后的想法和总结:

这道题是看了评论区的题解,明白了题目的用意以及需要怎样的思维方式

. - 力扣(LeetCode)

下图来自此题解

遇到的困难:

1 range function使用要牢记,含前不含后

2 关于python 二维数组的创建:

列表生成式法:

test = [[0 for i in range(m)] for j in range(n)]

关于二维数组:

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,二维数组又称为矩阵,行列数相等的矩阵称为方阵。

本题代码解法:

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, tar = 1, n*n
        while num <= tar:
            for i in range(l, r+1):
                 #left to right, 此处注意range function 使用,不包含最后一个元素
                 mat[t][i] = num
                 #此处像坐标一样对应每个二维数组
                 num += 1
            t += 1 
            for i in range(t, b+1): #top to bottom
                mat[i][r] = num
                num += 1
            r -= 1
            for i in range(r,l-1,-1):#right to left
                 mat[b][i] = num
                 num += 1
            b -= 1
            for i in range (b , t-1, -1):#bottom to top
                mat[i][l] = num
                num += 1
            l += 1
        return mat




        

今日收获,学习时长:

3days

因为209滑动窗口比较难,有遇到困难卡住的情况,之后可以重点复习此题

另有矩阵相关题目第一次做,需练习思维


数组专题总结:(array)

数组是存放在连续内存空间上的相同类型数据的集合。

要注意的几点:

1 数组的下标都是从0开始

2 数组内存空间的地址是连续的

3 range in array-不包含最后一位数字-(0,range-1)

  • 39
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值