代码随想录day2 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

news2024/11/24 23:12:27

文章目录

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

一、977.有序数组的平方

977.有序数组的平方
暴力法:O(NlogN) 先所有数字平方,然后再快排,时间复杂度取决于快排

class Solution
{
public:
    vector<int> sortedSquares(vector<int> &nums)
    {
        for (int i = 0; i < nums.size(); i++)
        {
            nums[i] = nums[i] * nums[i];
        }
        sort(nums.begin(), nums.end());
        return nums;
    }
};

双指针解法:O(N)
在这里插入图片描述


在这里插入图片描述

class Solution
{
public:
    vector<int> sortedSquares(vector<int> &nums)
    {
        int i = 0;
        int j = nums.size() - 1;
        int k = nums.size() - 1; // 控制res的下标,初始为最大值
        vector<int> res(nums.size(), 0);
        // 为啥取等号?i==j
        for (; i <= j;)
        {
            if (nums[i] * nums[i] > nums[j] * nums[j])
            {
                res[k] = nums[i] * nums[i];
                k--;
                i++;
            }
            else // nums[i]==nums[j]?
            {
                res[k] = nums[j] * nums[j];
                k--;
                j--;
            }
        }
        return res;
    }
};

1、为啥取等号?i==j

因为当nums[i]==nums[j]的时候循环还是要继续的,还要继续处理。

2、else 中nums[i]==nums[j]?

始终都要拿那个最大的数,去到第三方数组中,所以写在if和else中都可以。

二、209.长度最小的子数组

209.长度最小的子数组
暴力法:O(N2) 两层for循环

滑动窗口(双指针):O(N)
使用一个for循环,做了两个for循环的事情。
j 代表的是终止位置的下标,如果代表的是起始位置,那么后边的数字依旧需要遍历,那么和暴力有啥区别呢。
滑动窗口的精华就是,如何移动起始位置?当我们发现sum >=tar的时候,意思就是起始位置到终止位置的长度是符合要求的,那么起始位置就后移一位。

class Solution
{
public:
    /*
    i 窗口的起始位置
    j 窗口的终止位置
    sum 窗口中值的和
    sublen 窗口的长度
    res 记录结果,每次更新,初值为INT_MAX
    */
    int minSubArrayLen(int tar, vector<int> &nums)
    {
        int sum = 0;
        int sublen = 0;
        int res = INT_MAX;
        for (int i = 0, j = 0; j < nums.size(); j++)
        {
            sum += nums[j];
            while (sum >= tar) // if 还是 while
            {
                sublen = j - i + 1;
                res = min(sublen, res);
                sum -= nums[i];
                i++;
            }
        }
        return res == INT_MAX ? 0 : res;
    }
};

1、if 还是 while?

我们来看一种特殊情况:
在这里插入图片描述
使用if只能判断一次,但是遇到特殊情况下,这个窗口需要持续变化,那么只能用while。

2、while(sum >= tar)

到达这后,便要开始更新窗口的起始位置了。

3、return res == INT_MAX ? 0 : res; —?

有可能nums中没有符合要求的子序列,返回0即可。

三、59.螺旋矩阵II

59.螺旋矩阵II
面试中经常出现
这种模拟题最简单的还是在草稿纸上画一画!!!

模拟:O(N2)

循环不变量
坚持一个规则来处理每一条边,按照左闭右开的规则
在这里插入图片描述

class Solution
{
public:
    vector<vector<int>> generateMatrix(int n)
    {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int loop = n / 2;
        int mid = n / 2;            // 矩阵中间的位置
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int count = 1;              // 记录每个填入res中的值
        int offset = 1;             // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int i, j;                   // 用于控制循环
        while (loop--)
        {
            // ①
            for (j = starty; j < n - offset; j++)
                res[startx][j] = count++; // 注意后置加加,行不变,列一直在+1
            // ②
            for (i = startx; i < n - offset; i++)
                res[i][j] = count++; // i在+1,j用的就是上面那行for循环剩下的j
            // ③
            for (; j > starty; j--)
                res[i][j] = count++;// i,j初始都是用的上面那行for循环剩下的作为初始值
            // ④
            for (; i > startx; i--)
                res[i][j] = count++;// i,j初始都是用的上面那行for循环剩下的作为初始值

            startx++;
            starty++;
            offset++;
        }

        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if (n % 2 == 1)
        {
            res[mid][mid] = count;
        }
        return res;
    }
};

1、while(?)

我们这个循环应该转几圈呢?当n==3时我们要循环2圈,当n ==4时,要循环2圈。注意n为奇数的处理。

2、注意坐标中(x,y)与数组[i] [j]

数学坐标往右走确实变的是x,但在数组[i][j]中:向右遍历时,i不变,是j++。

3、startx++; starty++;

第二圈开始的时候,起始位置要各自加1。

4、offset++

控制每一圈里每一条边遍历的长度。

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

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

相关文章

Openlayers实战:加载天地图

国家地理信息公共服务平台“天地图”(以下简称“天地图“)是国家基础地理信息中心建设的网络化地理信息共享与服务门户。 其属于国家队的,有一定的权威性。 在Openlayers中如何加载天地图呢,方法很简单,用XYZ的形式。 它分为底图和标注,可以灵活的做配合使用。 效果图 源…

java学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA

文章目录 1、IDEA开发工具2、IDEA的下载和安装3、IDEA中的第一个代码4、IDEAZ中的类、模块、项目的操作 1、IDEA开发工具 2、IDEA的下载和安装 3、IDEA中的第一个代码 4、IDEAZ中的类、模块、项目的操作

PX4实战 各种问题的参数调整解决方案

桨叶旋转频率引起的噪声 比较好的震动 不好的震动 一般好的振动特性时&#xff0c;三轴加速度的原始数据值都会在很小的范围内波动&#xff0c;在3范围内就是非常好的振动环境了。 分析飞行器的幅频特性&#xff0c;一方面除了查看飞行器的振动特性好坏&#xff0c;另一方面…

技术架构的演进-八大架构

目录&#xff1a; 常见概念评价指标单机架构应用数据分离架构应用服务集群架构读写分离 / 主从分离架构引入缓存 —— 冷热分离架构垂直分库业务拆分 —— 微服务容器化引入——容器编排架构总结 1.常见概念&#xff1a; 应用&#xff08;Application&#xff09; / 系统&am…

安卓日志~

文章目录 bugreport获取报告设备模拟器adb命令用户 报告目录 阅读错误报告logcat定义日志记录抓取日志过滤优先级输出格式格式修饰符日志缓冲区 ANR触发ANR避免ANR工作线程 ANR日志定位无响应应用查看堆栈跟踪 死锁 activity内存内存不足内存快照 广播显示器争用后台编译叙述电…

linux终端前面显示base和不显示base

问题描述&#xff1a;前提是系统里装了anaconda3&#xff0c;有时候两个服务器之间相连长时间没使用或者访问时候前面没显示base。。 解决&#xff1a;我们在做深度学习时需要一个环境&#xff0c;如果前面没显示base的话&#xff0c;你直接conda activate是激活不了我们需要跑…

QT打开和保存文件对话框的操作笔记

QT打开和保存文件对话框的操作&#xff0c;需要先包含头文件QFileDialog&#xff0c;一般通过按钮实现打开和保存文件对话框的操作。 代码如下&#xff1a; #include <QDebug> #include <QFileDialog>void Form::on_pushButton_clicked() {QString fileName;fileN…

基于Javaweb实现ATM机系统开发实战(八)实时查询余额功能实现

老规矩&#xff0c;先看前端页面&#xff0c;把前端页面上没有的表达式都删掉&#xff1a; 创建servlet接受和处理请求&#xff1a; package com.atm.servlet;import com.atm.pojo.User; import com.atm.service.UserService; import com.atm.service.impl.UserServiceImpl;im…

HarmonyOS元服务开发

一、什么是HarmonyOS系统 HarmonyOS是华为开发的一款面向未来的全场景分布式智慧操作系统&#xff0c;将逐步覆盖18N全场景终端设备&#xff0c;用一个软件系统解决大量智能终端体验割裂的问题 1&#xff1a;智能手机 …

Freertos任务的管理是何物?

Freertos任务的管理 提示&#xff1a;文章来自正点原子和野火 文章目录 Freertos任务的管理前言一、任务的四种状态二、 四种状态的关系图三、函数vTaskSuspend();挂起vTaskResume() ;解挂函数 四、代码示例总结 前言 使用Freertos&#xff0c;创建任务&#xff0c;运行任务&a…

【1】Spring手写模拟-ApplicationContext获取对象

ApplicationContext获取对象 阶段目标 当前阶段任务&#xff0c;实现ApplicationContext 加载配置文件&#xff0c;实现对配置的包扫描&#xff0c;获取其字节码文件&#xff0c;查看是否包含注需要Spring管理&#xff0c;以及实现单例或者多例获取Bean对象 实现配置文件con…

实现虚拟机(VM15.5.0)与本机相互通信

目录 1、如果虚拟机一打开请先关机 2、进入“控制面板”-“网络和Internet”-“网络连接”&#xff0c;可以看到有两个虚拟网口&#xff0c;关闭虚拟网口VMnet1和VMnet8&#xff0c;如图所示&#xff1a; 3、选择需要通信的虚拟机&#xff0c;点击“编辑虚拟机设置”&#x…

力扣刷题 - 数组篇

这里写目录标题 数组的遍历485495414628 统计数组中的元素64569744844241数组的改变与移动453665---283 二维数组以及滚动数组118119661419--- 数组的旋转189396 特定顺序遍历二维数组5459498 二维数组的变换5664873--- 前缀和数组303238506 数组的遍历 485 https://leetcode.…

【HCIA】07.OSPF

动态路由的协议分类 按工作区域分&#xff1a; IGP&#xff08;内部网关协议 interior gateway protocols&#xff09;&#xff1a;OSPF、IS-IS、RIPEGP&#xff08;外部网关协议 exterior gateway protocols&#xff09;&#xff1a;BGP 按工作机制及算法分类&#xff1a; 距离…

机器学习(12)--K-Means

目录 一、聚类 二、机器学习中的距离 三、sklearn中的聚类算法 四、KMeans簇内平方和和时间复杂度 五、sklearn中的KMeans 1、建立一个数据集 2、使用K-Means进行聚类操作 3、根据上面的模型绘散点图观察分类效果。 4、评估指标 4.1对于真实标签已知情况 4.2当真实标…

[RocketMQ] Broker 消息重放服务源码解析 (十三)

构建消息文件ConsumeQueue和IndexFile。 ConsumeQueue: 看作是CommitLog的消息偏移量索引文件, 存储了它所属Topic的消息在Commit Log中的偏移量。消费者拉取消息的时候, 可以从Consume Queue中快速的根据偏移量定位消息在Commit Log中的位置。IndexFile索引文件: 看作是Commi…

【bash:xxx:command not found问题,在英伟达nvidia的jetson-orin-nx上遇到的>>>解决方式之一】

【bash:xxx:command not found问题,在英伟达nvidia的jetson-orin-nx上遇到的>>>解决方式之一】 1、概述2、实验环境3、问题描述&#xff1a;bash:xxx:command not found问题4、我的努力第一种方式&#xff1a;加入指令方式第二种方式&#xff1a;使用echo $PATH命令查…

设计模式(七)-----桥接模式(Bridge Pattern)

目录 什么是桥接模式优点缺点应用场景 基本结构业务场景不使用模式的解决方案实现发送普通消息实现发送加急消息实现发送特急消息添加发送手机消息的处理方式 使用桥梁模式来解决问题 什么是桥接模式 将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变…

Es直方图聚合--date_histogram

文章目录 1、背景2、bucket_key如何计算3、前置知识4、日历和固定时间间隔 4.1 Calendar intervals 日历间隔4.2 Fixed intervals 固定间隔 5、数据准备 5.1 准备mapping5.2 准备数据 6、聚合案例 6.1 dsl6.2 java代码6.3 聚合结果 7、完整代码8、参考文档 1、背景 此处来简单学…

云计算UPS监控,怎么办?

在大型数据机房中&#xff0c;UPS系统扮演着关键的角色&#xff0c;为计算机和网络设备提供可靠的电力备份。由于数据机房的规模庞大且关键性强&#xff0c;监控UPS系统的可靠性和效率至关重要。 UPS监控可以提供实时的电池状态、负载信息、电网电压等监测数据&#xff0c;并能…