_2LeetCode代码随想录算法训练营第二天C++

news2025/1/11 21:47:30

_2LeetCode代码随想录算法训练营第二天C++

LeetCode 题目列表:

  • 977.有序数组的平方
  • 209.长度最小的子数组
  • 59.螺旋矩阵II

977.有序数组的平方

题目所述数组含有负数。

双指针的思路

双指针的思路:

最大元素一定是在两边,考虑用两个指针逐步向中间合拢,得到一个由大到小的数组,在更新数组时也由大索引到小索引更新。

代码

/*
 * @lc app=leetcode.cn id=977 lang=cpp
 *
 * [977] 有序数组的平方
 */

// @lc code=start
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0);//初始化结果数组
        int index = nums.size() - 1;//初始化更新数组的index
        for(int i = 0,j = nums.size() - 1; i <= j; )//双指针往中间夹击
        {
            int muti_i = nums[i]*nums[i];//此处是为了少算一次*法
            int muti_j = nums[j]*nums[j];//此处是为了少算有一次*法
            if(muti_i > muti_j)//如果i指向的元素的平方更大
            {
                result[index--] = muti_i;//更新结果数组和更新index
                i++;//更新i
            }
            else//如果i和j指向的元素的平方相等或j指向的元素的平方更大
            {
                result[index--] = muti_j;//更新结果数组和更新index
                j--;//更新j
            }
        }
        return result;
    }
};
// @lc code=end

犯的错误

将这一句
for(int i = 0,j = nums.size() - 1; i <= j; )//双指针往中间夹击
写成了
for(int i = 0, int j = nums.size() - 1; i <= j; )//双指针往中间夹击
属于是低级错误

209.长度最小的子数组

暴力解法

使用两层嵌套for循环,第一层表示起始位置,第二层表示终止位置,遍历所有的情况,求得长度最小的子数组。

双指针的思路

滑动窗口的思想

只用一个for循环解决问题,那么for循环里面的索引是滑动窗口的起始位置还是终止位置呢?如果是起始位置,那么和暴力解法一样把所有的终止位置都遍历了一遍,所以是终止位置。

重点所在

那么如何决定起始位置呢?需要使用一个动态移动的策略确定。即当集合里面的所有元素和大于等于target时,就可以移动起始位置了。

代码

/*
 * @lc app=leetcode.cn id=209 lang=cpp
 *
 * [209] 长度最小的子数组
 */

// @lc code=start
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;//首先将结果赋值为超大的值
        int subLength = 0;//表示滑动窗口的大小
        int i = 0;//表示滑动窗口的起始位置
        int sum = 0;//记录滑动窗口元素和
        for(int j = 0;j < nums.size();j++)
        {
            sum += nums[j];//滑动窗口后移一位,就将新的滑动窗口的终止位置的元素加到sum中
            while(sum >= target)//当sum大于等于target时,就要更新起始位置了
            {
                subLength = j - i + 1;//求得当前滑动窗口的大小
                result = subLength < result ? subLength : result;//与result比较,如果比result更小则更新result为subLength;否则不更新result。
                sum -= nums[i++];//sum减掉滑动窗口起始位置的元素,更新i
            }
        }
        return result < INT32_MAX ? result : 0;
    }
};
// @lc code=end

时间复杂度

每个元素在滑动窗口进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。

问题

在for循环中,为什么不使用if而使用while呢?

如果target = 100

可能存在这样的滑动窗口:[1, 1, 1, 1, 1, 100]

需要求得最小的result。

59.螺旋矩阵II

错误思路

处理每条边的时候,规则不统一;导致需要处理很多边界条件,这样就很容易出错。

循环不变量

循环就是一圈一圈地处理,不变量就是每条边地处理规则一样。
在这里插入图片描述

采用左闭右开的规则:如上图所示,处理第一行时只处理1、2;处理第三列时只处理3、4;处理第三行时只处理5、6;处理第一列时只处理7、8;对于每一个循环皆如此,直到循环结束。

代码

/*
 * @lc app=leetcode.cn id=59 lang=cpp
 *
 * [59] 螺旋矩阵 II
 */

// @lc code=start
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));//使用vector定义一个二维数组
        int startx = 0,starty = 0;//定义初始位置为(0,0)
        int loop = n / 2;//表示执行几个圈,n为偶数时可行,但是n为基数时会忘掉中心位置的元素,这个就可以在最后做一个判断
        int offset = 1;//执行一圈就将其加1,目的是计算边界
        int data = 1;//记录数值1->2->3...->n
        int i,j;//相当于是索引
        while(loop--)
        {
            i = startx, j = starty;
            //处理一个圈的上(左闭右开)
            for(; j < n - offset; j++)
                res[startx][j] = data++;
            //处理一个圈的右(左闭右开) 此时j == n - offset
            for(; i < n - offset; i++)
                res[i][j] = data++;
            //处理一个圈的下(左闭右开) 此时i == n - offset, j == n - offset
            for(; j > starty; j--)
                res[i][j] = data++;
            //处理一个圈的左(左闭右开),此时i == n - offset, j == starty
            for(; i > startx; i--)
                res[i][j] = data++;
            
            //处理完一圈之后,要移动初始位置和offset
            startx++;
            starty++;
            offset++;
        }
        if(n % 2 == 1)//如果n是基数,则要添加以下中心位置的元素
        {
            int mid = n / 2;
            res[mid][mid] = data;
        }
        return res;
    }
};
// @lc code=end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHY寄存器解读

以太网PHY寄存器分析 1 1、以太网PHY标准寄存器分析 2 1.1 Control Register 2 1.2 Status register 5 1.3 PHY Identifier Register 8 1.4 Auto-Negotiation Advertisement Register 8 1.5 Auto-Negotiation Link Partner Base Page Ability Register…

NY CREATE和Bleximo宣布达成新量子计算研发合作

&#xff08;图片来源&#xff1a;网络&#xff09; 12月7日&#xff0c;全栈量子计算系统集成公司Bleximo Corp.宣布&#xff1a;计划将其原型设计和营销业务扩展到纽约北部的奥尔巴尼纳米技术综合体(Albany NanoTech Complex)。该公司还将与纽约研究、经济发展、技术、工程和…

llvm编译、自带例子toy、llvm编译报错解决、.lib中搜索指定函数名

hunterzju/llvm-tutorial cs.cmu.edu/academic/class/15745-s14/public/lectures 编译llvm cd /d d:\llvm-home\ git clone gitgitcode.net:pubz/llvm-project.gitcd /d d:\llvm-home\llvm-project\ git status #HEAD detached at llvmorg-11.0.0set PATH%PATH%;D:\Python38\S…

ImmunoChemistry丨艾美捷NIR-FLIVO 690游离染料对照试验说明书

ImmunoChemistry艾美捷ICT近红外&#xff08;NIR&#xff09;-FLIVO示踪剂与无NIR-FLIVO染料对照分析结合使用。无NIR-FLIVO染料控制试验使用无NIR-FRIVO染料检测试剂&#xff08;*Dylight690游离染料&#xff09;。注射时&#xff0c;游离染料对照物和示踪物试剂都会产生荧光信…

Java集合 超详细版+面试题

程序总是根据运行时才知道的某些条件去创建新的对象。在此之前&#xff0c;无法知道所需对象的数量甚至确切类型。为了解决这个普遍的编程问题&#xff0c;需要在任意时刻和任意位置创建任意数量的对象。下面讲详细介绍如何使用标准库中的集合类。 集合框架图 简化图&#xff…

遗传算法求解问题(1)

问题描述 在一个长度为 n 的数组中选择 10 个元素&#xff0c;使得 10个元素的和 与 该元组中元素总和的 1/10 接近 问题约束 数组长度 n&#xff1a;10 < n < 100; 数组中没有重复的数字&#xff0c;所以选择的10个元素中也没有重复的数字 遗传算法原理 请移步我上…

国产第一颗7A的车规级马达驱动芯片TMI8140-Q1

新能源汽车因其电动化和智能化的特性&#xff0c;需要大量的马达驱动、DC/DC、高效率Buck & BuckBoost等车规级芯片&#xff0c;成为名副其实的“芯片大户”&#xff01; 以往制造一辆传统汽车一般需要用到500-600颗左右的芯片&#xff0c;而一台高性能的新能源汽车需要芯…

上传IPA包到App Store​

我们都经历过上传IPA包到App Store时的痛苦&#xff01;&#xff01;&#xff01;​ 第一步&#xff1a;通过Xcode-> Archive&#xff0c;Validate App&#xff0c;成功&#xff01;​ 第二步&#xff1a;通过Xcode-> Archive&#xff0c;Distribute App&#xff0c;成…

从股票市场选择配对的股票:共同趋势模型与套利定价理论

股价取对数之后的序列建模为随机游走。现在把取对数之后的股价当作是由一个随机游走和一个平稳时序组成&#xff1a; 是随机游走部分&#xff0c;是平稳部分。取对数后的股价求差就得到回报。所以在时间的回报表示为&#xff1a; 表示非平稳部分的回报&#xff0c;表示平稳部分…

如何基于运维事件中心通过 logstash 进行日志关键字监控

日常运维过程中&#xff0c;很多场景都需要对日志关键字进行监测&#xff0c;以便第一时间发现应用/业务相关异常&#xff0c;这是一种比较常见的监控需求&#xff0c;所以也有很多方法可以实现关键字告警。对于简单的告警可以通过一些传统的监控工具实现&#xff0c;但对于体量…

从头开始搭建一个SpringBoot项目--SpringSecurity的配置

从头开始搭建一个SpringBoot项目--SpringSecurity的配置前言本文的目标使用到的依赖、Redis配置、通用返回实体类依赖Redis项目里的配置通用返回实体ResultResultCodeResultUtil配置文件配置的目录结构Spring Security的配置信息SecurityConfigWebMVCConfig用到的类及代码自定义…

深入浅出自定义创建spring-boot-starter

深入浅出自定义创建spring-boot-starter https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration 快速入手 第一步&#xff1a;新建模块 第二步&#xff1a;修改依赖 <?xml version"1.0" e…

关键词(三)

关键词一.最冤枉的关键字—sizeof二.“简单”的布尔类型—_Bool一.最冤枉的关键字—sizeof 前面我们说过定义变量是需要空间的&#xff08;声明不需要&#xff09;&#xff0c;同时你需要有类型像int,char…这些不同的类型会在内存中开辟不同大小的空间&#xff0c;而sizeof就可…

Web安全测试工具AppScan简述

01 安全测试的对象 了解常见的Web应用安全漏洞&#xff0c;参考OWASP Top 10 2017。 理解这些常见漏洞的攻击原理&#xff0c;如何判断系统是否存在这些漏洞、如何防止这些漏洞。 02 安全测试的实施 SQL注入测试 确认所有的解释器都明确的将不可信数据从命令语句或者查询语…

微服务囧途之BFF层登场

从单体架构演化为微服务架构后&#xff0c;架构者的期望是“模块A”“模块B” “后端服务”。 场景一 Web端和Mobile端都有一个详情页面&#xff0c;需要调用模块A的getDetail接口获取数据。假设Web端实际需要展示的字段是20个&#xff0c;Mobile端实际需要展示的字段是10个…

记一次Metrics-server异常

报错 前几天测试环境k8s集群做etcd的备份恢复。 所有的pod都起来了&#xff0c;包括metrics-server的状态也是 Running,部署新pod也没有异常&#xff0c;结果kubectl top 请求的时候报错了 Error from server (ServiceUnavailable): the server is currently unable to handle …

Spring cloud Consul 服务注册中心实战

Spring cloud Consul服务注册中心一、简介二、功能三、角色四、工作原理1、服务注册及发现2、服务调用五、起步1、下载2、安装六、实例一、简介 Consul 用于实现分布式系统的服务注册与配置&#xff0c;与其它方案相比&#xff0c;Consul 更 “一站式”&#xff0c;内置了服务…

移植lighttpd笔记

一、前言 lighttpd交叉编译并移植到iTop4412平台 二、编译环境 ubuntu 18.04pcrelighttpd交叉编译链:arm-none-linux-gnueabi三、编译过程 1.pcre交叉编译 tar -xvf pcre-8.38.tar.bz2 cd pcre-8.38/ ./configure --host=arm-none-linux-gnueabi --prefix=/ --enable-utf8 …

IDEA中如何实现 git stash 命令的可视化操作?

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a;git stash 相关命令 1、git stash 2、git stash save 注释 3、git stash list 4、git stash pop 5、git stash apply stash{编号} 6、git stash drop stash{编号} 7、git stash clear 8、git stash…

flutter 内网安装包生成二维码

参考 前言 有时候我们可能需要用手机访问电脑上的文件, 或者用手机测试电脑上编写的程序 此时 在同一个wifi网络的前提下我们可以这么做: 第一种 使用python 直接使用自带python工具开启http服务, 首先打开终端, 进入需要共享的目录,然后运行以下代码即可: python -m Simple…