首页 > 其他分享 >代码随想录打卡Day2

代码随想录打卡Day2

时间:2024-10-19 08:49:08浏览次数:9  
标签:int 随想录 sum Day2 ++ result 序列 打卡 vec

                                                                                                                                  源自力扣209题

法一 暴力求解 

解答代码如下

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

两个for循环嵌套,蠢蠢的枚举!

法二 双指针(快慢指针/滑动窗口)

解答代码如下

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; // 滑动窗口数值之和
        int i = 0; // 滑动窗口起始位置
        int subLength = 0; // 滑动窗口的长度
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n),

十分巧妙。

大体思路如下

step1:定义窗口初始长度subLength=0,一个累加器sum=0

step2:上for循环,将j作为窗口终点,如果sum<s,将起始位置向后移一位,即窗口长度增加一;

step3:嵌套一个while循环执行:如果sum>=s,将起始位置向前移一位,即窗口长度尝试缩小一位;同时记录下每次满足题意的长度,大小比较后进行答案的不断更迭。

step4:返回答案

如果result没有被赋值的话,就返回0,说明没有符合条件的子序列

                                                                                                                                     源自力扣59题

解答代码如下

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n, 0));  // 初始化 n x n 的矩阵
        int startx = 0, starty = 0;  // 起始位置
        int loop = n / 2;  // 循环的层数
        int offset = 1;  // 每一圈缩小的步数
        int count = 1;  // 用来填充的数字
        int mid = n / 2;  // 如果 n 是奇数时,矩阵的中心位置
 
        // 处理每一圈螺旋
        while(loop--) {
            int i = startx;
            int j = starty;
            
            // 1. 从左到右,填充上边
            for (; j < n - offset; j++) {
                result[i][j] = count++;
            }
            // 2. 从上到下,填充右边
            for (; i < n - offset; i++) {
                result[i][j] = count++;
            }
            // 3. 从右到左,填充下边
            for (; j > starty; j--) {
                result[i][j] = count++;
            }
            // 4. 从下到上,填充左边
            for (; i > startx; i--) {
                result[i][j] = count++;
            }
            
            // 更新每一层起始点
            startx++;
            starty++;
            offset++;
        }
        
        // 如果 n 是奇数,最后剩下中心一个位置
        if (n % 2) {
            result[mid][mid] = count;
        }
        
        return result;
    }
};

不涉及算法,但非常考验对多过程的细节把控

这张图很好地把拐角处理成了换边

但中心位置需要另外考虑(也就是if的选择结构)

 

先上代码

#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n, a, b;
    cin >> n;
    vector<int> vec(n);
    vector<int> p(n);
    int presum = 0;
    for (int i = 0; i < n; i++) {
        scanf("%d", &vec[i]);
        presum += vec[i];
        p[i] = presum;
    }

    while (~scanf("%d%d", &a, &b)) {
        int sum;
        if (a == 0) sum = p[b];
        else sum = p[b] - p[a - 1];
        printf("%d\n", sum);
    }
}

 首先声明,题很简单,但如果把时间复杂度给限制死,不太容易想到。

感觉上,很像dfs与记忆化搜索的区别优化

实现过程

p[1] = vec[0] + vec[1];

p[5] = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5];

p[5] - p[1] = vec[2] + vec[3] + vec[4] + vec[5];

平时没有注意复杂度计算的很难注意到。

标签:int,随想录,sum,Day2,++,result,序列,打卡,vec
From: https://blog.csdn.net/2401_86177347/article/details/143060150

相关文章

  • 代码随想录打卡Day3
    链表:通过指针链接的线性数据结构。链表由两部分组成,一为数据域,一为指针域。并与结构体有很大关系,链表的节点一般都是结构体,其中包含了该节点的数据部分以及指向下一节点的指针。通过这种方式,链表将结构体与指针连接起来,从而构建一个强大的数据结构,可以同时实现数据的组织和动......
  • 代码随想录算法训练营day19| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插
    学习资料:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html****学习记录:235.二叉搜索树的最近公共祖先(加一个函数traversal)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(self,x):#self.val=x......
  • 代码随想录算法训练营day18 |530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数
    学习资料:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html530.二叉搜索树的最小绝对差(双指针法,pre&cur,设置最小差值初始为无穷大,当差值<最小差值就更新最小差值)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(......
  • 代码随想录算法训练营第三天|203.移除链表元素,707.设计链表,206.反转链表
    1前言今日主要学习链表的基础leetcode203移除链表元素leetcode707设计链表leetcode206反转链表2链表的基础链表分为单链表和双链表,与字符串的区别就是链表是在一个里面存储了数据+下一个数据的内存地址链表中存储的内存空间是可以不连续的2.1链表的定义2.1.1......
  • 代码随想录算法训练营 | 115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离
    115.不同的子序列题目链接:115.不同的子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰不同的子序列日期:2024-10-18想法:dp[i][j]表示以s[i-1],t[j-1]结尾的s,t自学列中满足s的子序列为t的个数,如果s[i-1],t[j-1]相等,那么个数应该跟双方上一个结尾状态dp[i-1][j-......
  • 20241018打卡
    Simai是一种用于绘制maimaiDX谱面的脚本语言,主要用于定义游戏中的音符位置、类型和时间,使玩家能够在触摸屏上按照音乐节奏进行操作。这种语言广泛用于创建自定义谱面,为maimaiDX提供独特的挑战和体验。Simai语言的基本语法:文件头和元数据:通常在脚本开头定义一些元数据,......
  • 打卡信奥刷题(069)用C++工具信奥P11076[普及组/提高] 「FSLOI Round I」单挑
    「FSLOIRoundI」单挑题目背景Englishstatement.YoumustsubmityourcodeattheChineseversionofthestatement.小F和小S经常进行篮球单挑,但小S总是被盖帽。题目描述每次单挑的结果一定是小F获胜或者小S获胜,不存在平局的情况。由于小F和小S实......
  • 代码随想录算法训练营 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断
    1143.最长公共子序列题目链接:1143.最长公共子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长公共子序列日期:2024-10-17想法:这里的子序列不要求连续了,dp[i][j]要表示为在text1[0,i-1]和text2[0,j-1]的范围里,最长的公共子序列长度,-1同样是为了初始化方便,如果te......
  • 代码随想录算法训练营第二天|209长度最小的子数组、59螺旋矩阵
    1leetcode209长度最小的子数组题目链接:209.长度最小的子数组文章链接:代码随想录(programmercarl.com)视频链接:拿下滑动窗口!|LeetCode209长度最小的子数组思路:没有思路,看到这道题有一种想立马退出的感觉,无从下手1.1暴力搜索1.1.1python版本这个版本的新知识就是定义......
  • 代码随想录|二叉树part 03
    求普通二叉树的节点数量要点:将子节点的个数记录到父节点,使用后序遍历classSolution{public:intmaxDepth(TreeNode*root){if(root==NULL)return0;intleft1=maxDepth(root->left);intright1=maxDepth(root->right);intnum=......