首页 > 编程语言 >代码随想录算法训练营第二天|209长度最小的子数组、59螺旋矩阵

代码随想录算法训练营第二天|209长度最小的子数组、59螺旋矩阵

时间:2024-10-17 14:58:54浏览次数:8  
标签:vector 59 target nums 209 随想录 int num result

1 leetcode209长度最小的子数组

题目链接:209. 长度最小的子数组

文章链接:代码随想录 (programmercarl.com)

视频链接:拿下滑动窗口! | LeetCode 209 长度最小的子数组

思路:没有思路,看到这道题有一种想立马退出的感觉,无从下手

1.1暴力搜索

1.1.1python版本

这个版本的新知识就是定义一个无限大的数使用的是num = float('inf')

  1. 两层for循环

这个代码可以运行,但是在这个列表太长的情况下出现了一个超出索引

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        result = float('inf')
        for i in range(len(nums)):
            sum_num = 0
            for j in range(i,len(nums)):
                sum_num +=nums[j]
                if sum_num>=target:
                    middle = j-i+1
                    result = min(result,middle)
                    break
        return result if result !=float('inf') else 0
  1. 两层循环用while

暴力搜索还是超出时间限制了

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        result = float('inf')
        i = 0
        while i<len(nums):
            sum_num = 0
            j = i
            while j <len(nums):
                sum_num +=nums[j]
                if sum_num>=target:
                    middle = j-i+1
                    result = min(result,middle)
                    break
                j +=1
            i +=1
        return result if result !=float('inf') else 0
1.1.2 C++版本
  1. 定义一个无限大的数是```num = INT32_MAX``
  2. 语法if a<b: a=a else:a=b在 这个语言中可以写成a=a<b?a:b
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        for (int i =0;i<nums.size();i++){
            int sum_num = 0;
            for(int j=i;j<nums.size();j++){
                sum_num = sum_num+nums[j];
                if (sum_num>=target){
                    result = result<(j-i+1)?result:(j-i+1);
                    break;
                }
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

1.2滑动窗口的思路

这个里面的一个思路两个指针滑动首先滑动的是终止位置的,第二个里面使用if还是while的判断,才开始不理解,后面举个例子而言target = 7,nums=[3,1,2,4],如果是if的话就i继续增加,他的长度不会改变,但是使用while循环的话,终点的指针保持不变,对n进行增加的话,nums=[1,2,4]也同样满足要求

1.2.1 python版本
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = 0
        sum_num = 0
        result = float('inf')
        for i in range(len(nums)):
            sum_num +=nums[i]
            while sum_num>=target:
                 sublength = i-n+1
                 result = min(result,sublength)
                 sum_num -=nums[n]
                 n +=1
        return result if result != float('inf') else 0
1.2.2 C++版本
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum_num = 0,start_ind = 0;
        for (int i=0;i<nums.size();i++){
            sum_num +=nums[i];
            while (sum_num>=target){
                int sublength = i-start_ind+1;
                result = result <sublength?result:sublength;
                sum_num -=nums[start_ind];
                start_ind++;
            }
        }
        return result ==INT32_MAX ?0:result;
    }
};

1.3滑动窗口小结

  1. 针对滑动窗口首先要知道循环中改变的是什么数值,是终止位置的索引位置
  2. 为什么判断大小的时候用的是while循环而不是if条件判断,因为这道题需要找的是最小索引值,最简单的例子,数组循环遍历的时候,target = 7,nums=[3,1,2,4],如果使用条件语句的话直接返回的值是4,但是根据我们题目要求要找到最小值,1+2+4=7,这个的长度为3,比4小,所以要用while循环,而不是if条件判断

2 leetcode59 螺旋矩阵

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

文章链接:代码随想录 (programmercarl.com)

视频链接:手把手带你学会操作链表 | LeetCode:203.移除链表元素

思路:看完视频做的时候还会很懵的一道题,哈哈哈哈哈

2.1算法解决问题结果

2.1.1 python版本

这里定义一个二维n*n全为0的列表方法new_list = [[0]*n for _ in range(n)]

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        l = 0
        startx,starty = 0,0
        count = 1
        new_list = [[0]*n for _ in range(n)]
        offset = 1
        mid = n//2
        while l<mid:
            i,j =startx,starty
            while j<(n-offset):
                new_list[startx][j] = count
                count +=1
                j +=1
            while i<(n-offset):
                new_list[i][j] = count
                count +=1
                i +=1
            while j>starty:
                new_list[i][j] =count
                count+=1
                j -=1
            while i>startx:
                new_list[i][j] = count
                count +=1
                i -=1
            startx +=1
            starty +=1
            offset +=1
            l +=1
        if n%2 !=0:
            new_list[mid][mid] = count
        return new_list
2.2.2 C++版本

C++里面定义一个矩阵的方法就是两层数组,即vector<vector<int>> res(n,vector<int>(n,0));

这句话开始vector<vector<int>>是定义数组的类型,就是二维数组

res表示的数组的名称

(n,vector<int>(n,0))这句话里面首先是代表数组的列有n列,然后再一个向量中嵌套一个向量即为矩阵,第二个就是给定行以及内部的赋值

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int startx=0,starty=0;
        int for_num = n/2,mid = n/2;
        int offset =1,count = 1;
        int i,j;
        while (for_num--){
            i = startx;
            j = starty;
            for (j;j<n-offset;j++){
                res[startx][j] = count++;
            }
            for (i;i<n-offset;i++){
                res[i][j]=count++;
            }
            for (j;j>starty;j--){
                res[i][j]=count++;
            }
            for (i;i>startx;i--){
                res[i][j]=count++;
            }
            offset++;
            startx++;
            starty++;
        }
        if (n%2){
            res[mid][mid]=count;
        }
        return res;
    }
};

2.2 螺旋矩阵总结

  1. 定义矩阵的方法是要在一个一维列表的基础上在里面进行嵌套,对其行进行确定即可定义
  2. 这里的代码写法有一点需要注意,其内部的循环是模拟人行走的过程,所以代码的行和列顺着旋转即可
  3. 代码旋转完以后如果是奇数则需要确定中间数值,否则就是可以跳出矩阵

3 今日总结

3.1代码部分

3.1.1 python
  1. 在定义一个数字无限大的时候,使用的方法是将其数值定义为float('inf')
  2. 定义一个n*n矩阵内部全为0的矩阵方法是l = [[0]*n for _ in range(n) ]
3.1.2 C++部分
  1. 定义一个无限大的数字代码为INT32_MAX
  2. 比较一个数值是用其原始值还是使用新计算的值的代码为a = a<b ? a:b
  3. 定义一个n*n的矩阵的代码是vector<vector<int>> res (n,vector<int>(n,0))

3.2 题目部分

  1. 最小长度的思路就是滑窗,滑窗的关键要知道外层循环中的快速数值是什么,主要为终止位置的后缀,慢指针为起始位置的地方
  2. 螺旋矩阵转动的题目,主要看的点在于其旋转过程中对于矩形而言,其每条边应该选择左闭又开区间的代码对其进行循环

标签:vector,59,target,nums,209,随想录,int,num,result
From: https://www.cnblogs.com/csfy0524/p/18472344

相关文章

  • 代码随想录|二叉树part 03
    求普通二叉树的节点数量要点:将子节点的个数记录到父节点,使用后序遍历classSolution{public:intmaxDepth(TreeNode*root){if(root==NULL)return0;intleft1=maxDepth(root->left);intright1=maxDepth(root->right);intnum=......
  • 代码随想录|二叉树part 02
    翻转二叉树要点:指针交换优先利用前序或后序遍历,若采用中序遍历(则两次采用遍历左子树)classSolution{public:TreeNode*invertTree(TreeNode*root){if(root==NULL)returnroot;swap(root->left,root->right);invertTree(root->left);......
  • 代码随想录算法训练营 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数
    300.最长递增子序列题目链接:300.最长递增子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长递增子序列日期:2024-10-16想法:dp[i]表示以nums[i]结尾的最长子数列长度,需要知道i之前的j的dp[j],找到最大的dp[j],再加1,初始化都为1。Java代码如下:classSolution{pub......
  • 代码随想录训练营第64天|bellman_ford
    47.参加科学大会#include<iostream>#include<vector>#include<list>#include<queue>#include<climits>usingnamespacestd;//小顶堆classmycomparison{public:booloperator()(constpair<int,int>&lhs,constpai......
  • 代码随想录训练营第58天|统计相邻
    110.字符串接龙#include<iostream>#include<vector>#include<string>#include<unordered_set>#include<unordered_map>#include<queue>usingnamespacestd;intmain(){stringbeginStr,endStr,str;intn;ci......
  • 代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜
    学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课用前序遍历构造二叉树二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。二叉搜索树的搜索和验证时不关心遍历顺序,因......
  • 代码随想录算法训练营第一天|704二分查找、27移除元素、977有序数组的平方
    代码随想录算法训练营第一天|704二分查找、27移除元素、977有序数组的平方1Leetcode704二分查找题目链接:[704.二分查找](704.二分查找-力扣(LeetCode))文章链接:[代码随想录](代码随想录(programmercarl.com))视频链接:[手把手带你撕出正确的二分法|二分查找法|二分搜......
  • 代码随想录算法训练营第42天 | 第九章动态规划 part2
    文章目录第十章单调栈part0242.接雨水示例数组:过程解释表格:过程解析:双指针法84.柱状图中最大的矩形双指针法单调栈法第十章单调栈part0242.接雨水接雨水这道题目是面试中特别高频的一道题,也是单调栈应用的题目,大家好好做做。建议是掌握双指针和单调栈,因......
  • 代码随想录算法训练营day16| 513.找树左下角的值 112.路径总和 106.从中序和后序
    学习资料:https://programmercarl.com/0513.找树左下角的值.html#算法公开课递归、回溯返回值:True/False,root构建二叉树TrueNode(root_value)513.找树左下角的值(实例变量self.result,self.maxdepth;找到叶子节点,若深度>self.maxdepth,则更新最大深度;只考虑左和右子树,用递归+......
  • P4590
    怎么这么多忘交的一起发的原因还是vjudge#include<bits/stdc++.h>usingnamespacestd;intread(){ intx=0; boolop=0; charc=getchar(); while(!isdigit(c))op|=(c=='-'),c=getchar(); while(isdigit(c))x=(x<<1)+(x<<3)+(c......