代码随想录-数组

news2024/11/20 16:29:08

学习《代码随想录》

  • 理论基础
    • 什么是数组?
  • 二分查找
    • 左闭右闭
    • 左闭右开
  • 移除元素
    • 暴力法
    • 双指针法
  • 长度最小的子数组
    • 暴力法
    • 滑动窗口
  • 螺旋矩阵

理论基础

什么是数组?

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

二分查找

在这里插入图片描述

有两种解法:左闭右闭、左闭右开

左闭右闭

即 [ left , right ]

class Solution {
public:
    int search(vector<int>& nums, int target) {
		int left = 0;
        int right = nums.size() - 1; //定义为左闭右闭
        while (left <= right) { //见注1
            //这一步等同于(left + right) / 2,如下处理为了防止内存溢出
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) { //说明target在左区间
                right = middle - 1;
            }else if (nums[middle] < target) {
                left = middle + 1;
            }else {
                return middle;
            }
        }
        return -1;
    }
};

  1. 因为定义了左闭右闭,所以 left 可以取到 right ,用<=

左闭右开

即 [ left , right )

class Solution {
public:
    int search(vector<int>& nums, int target) {
		int left = 0;
        int right = nums.size(); //定义为左闭右开
        while (left < right) { //left取不到right
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle; //左区间是[left,middle)
            }else if (nums[middle] < target) {
                left = middle + 1;
            }else {
                return middle;
            }
        }
        return -1;
    }
};

移除元素

在这里插入图片描述

两种解法:暴力法、双指针法

暴力法

用两层for循环向前覆盖元素

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
		int size = nums.size();
        for (int i = 0; i < size; i++)  { //第一个for循环遍历数组元素
            if (nums[i] == val) {
                for (int j = i + 1; j < size; j++) { //第二个for循环更新数组
                    nums[j - 1] = nums[j];
                }
                i--; //i后的元素都向前移了一位,所以i--
                size--;
            }
        }
        return size;
    }
};

时间复杂度:O(n^2)

空间复杂度:O(1)

双指针法

用两个指针(快指针和慢指针)在一层for循环实现两层for循环的工作

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
		int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            //若找到该元素,fastIndex++,slowIndex不动
            if (nums[fastIndex] != val) {
			//在下一次循环,用fastIndex指向的元素覆盖slowIndex的
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

长度最小的子数组

在这里插入图片描述

两种解法:暴力法、滑动窗口

暴力法

第一个for循环遍历所有元素,第二个for循环查找从该元素到数组末尾

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
		int result = INT32_MAX; //结果
        int sum = 0;
        int subLength = 0; //记录最小长度
        for (int i = 0; i < nums.size(); i++) {
            sum = 0;
            for (int j = i; j < nums.size(); j++) {
                sum += nums[j];
                if (sum >= target) { //一旦和大于target,记录最小长度
                    subLength = j - i + 1;
                    result = result < subLength ? result : subLength;
                    break;
                }
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

时间复杂度:O(n^2)

空间复杂度:O(1)

滑动窗口

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
		int result = INT32_MAX;
        int sum = 0;
        int subLength = 0;
        int i = 0; //记录窗口起始位置
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            while (sum >= target) {
                subLength = j - i + 1;
                result = result > subLength ? subLength : result;
                //滑动窗口的精髓,i一直在变
                sum -= nums[i++];
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

时间复杂度:O(n)

空间复杂度:O(1)

螺旋矩阵

在这里插入图片描述

坚持循环不变量:左闭右开

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
		vector<vector<int>> res(n, vector<int>(n, 0));
        int startx = 0, starty = 0;
        int loop = n / 2; //圈数,n=3时就一圈
        int mid = n / 2; //如果n为奇数,最后要给中间位置赋值
        int count = 1; //记录赋的值
        int offset = 1; //控制每圈的长度,但不是长度
        int i, j;
        while (loop--) {
            i = startx;
            j = starty;
            //四次循环就是一圈
            for (j = starty; j < starty + n - offset; j++) {
                res[startx][j] = count++;
            }
            for (i = startx; i < startx + n - offset; i++) {
                res[i][j] = count++;
            }
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            for (; i > startx; i--) {
                res[i][j] = count++;
            }
            
            //每次循环后的处理
            startx++;
            starty++;
            offset += 2;
        }
        //如果是奇数
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};

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

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

相关文章

spring6概述

Spring6要求JDK最低版本是JDK17 Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开…

阿里云李钟:弹性计算控制系统团队的提效之路

2023 年 3 月 25 日&#xff0c;“城市领航之夜第一期”活动在上海举行&#xff0c;阿里云弹性计算控制系统技术架构负责人李钟出席了本次活动并带来了《弹性计算控制系统团队提效之路》的主题演讲&#xff0c;为大家详细分享了阿里云弹性计算控制系统团队所面临的挑战、如何通…

计算机毕业论文选题推荐|软件工程|系列五

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)遥感图像的居民…

言之画: AI绘画平台

【产品介绍】 言之画是出门问问推出的AI绘画平台。支持二次元、蒸汽朋克、插画等 8 种创作风格。用户只需输入文字&#xff0c;「言之画」就能一次性生成 8 张光影逼真、细节丰富的 2K 高分辨率图像。 除了以文生图&#xff0c;它还拥有以图生图、动图生成、个性头像生成等 AI …

MATLAB 之 常用内部函数,运算,字符串和结构数据与单元数据

文章目录 一、常用内部函数1. 常用数学函数2. 矩阵的超越函数2.1 矩阵平方根2.2 矩阵对数2.3 矩阵指数2.4 普通矩阵函数 二、MATLAB 运算1. 算术运算1.1 基本算术运算1.2 点运算 2. 关系运算3. 逻辑运算 三、字符串1. 字符串的表示2. 字符串的操作2.1 字符串的执行2.2 字符串与…

ChatGPT下的自动化工具Auto-GPT、AgentGPT、BabyAGI和GodMode

ChatGPT 对于一个大目标来说&#xff0c;他是不知道怎么一步一步的帮我们构建出来。有了Auto-GPT、AgentGPT、BabyAGI和GodMode 这些自动化工具&#xff0c;我们只需要输入一个大目标&#xff0c;这些自动化工具能够帮我们一步一步轻松实现。 1.Auto-GPT 网址&#xff1a;htt…

C/C++每日一练(20230512) 成绩打印、补齐数组、水仙花数

目录 1. 成绩打印 ※ 2. 按要求补齐数组 &#x1f31f;&#x1f31f;&#x1f31f; 3. 水仙花数 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 成绩打印 一个班有10个同学&am…

airserver7.2.7最新中文版下载及功能介绍

最近开会打算把手机投屏到自己的Mac上演示用&#xff0c;于是就打算用下听了很久好用但是一值没有使用的AirServer!十分简单的操作就可以完美的投屏到Mac电脑&#xff0c;而且不用像Mac自带的QuickTime用线连接手机!它可以把AirPlay / AirTunes上的音频、视频、照片、幻灯片还有…

母亲节祝福html源码,母亲节祝福html代码,母亲节表白妈妈代码,母亲节祝福网页代码

母亲节祝福html源码&#xff0c;母亲节祝福html代码&#xff0c;母亲节表白妈妈代码&#xff0c;母亲节祝福网页代码 运行截图 核心代码&#xff1a; <!DOCTYPE HTML> <html lang"zh-Hans"> <head><meta charset"utf-8"><meta…

我们选择护眼台灯的标准是什么?护眼台灯的国家标准

小时候在学校&#xff0c;父母跟老师经常强调“眼睛是心灵的窗户”要保护好眼睛&#xff0c;不管是在学校上学还是在家写作业时&#xff0c;都会很突然的听见“头抬高点”、“眼睛离远点”等类似的劝导&#xff0c;刚开始还不以为然&#xff0c;直到视力下降&#xff0c;带上了…

ctf_BUUCTF_web_总结(待更新)

文章目录 SQL注入文件上传漏洞文件包含漏洞php反序列化RCE模板安全问题&#xff08;SSTI&#xff09;XXE代码审计杂七杂八的知识点正则表达式CTF做题总结 SQL注入 [极客大挑战 2019]EasySQL[SUCTF 2019]EasySQL[强网杯 2019]随便注[极客大挑战 2019]BabySQL[BJDCTF2020]Easy MD…

雪浪云算力开发者大赛

1赛题背景 汽车生产工艺复杂&#xff0c;一辆汽车的制造需要完成焊装、涂装、总装三大工艺&#xff0c; 经过焊装车间、涂装车间、总装车间。各车间存在上下游关联关系&#xff0c;每个车间有自己的优化排序目标&#xff0c;需要综合考虑多种复杂的排序规则及工艺约束&#xf…

9.100ASK_V853-PRO开发板支持E907小核开发

0.前言 ​ 100ASK_V853-PRO开发板的V853芯片集成Arm Cortex-A7和RISC-V E907 双CPU&#xff0c;玄铁E907 是一款完全可综合的高端 MCU 处理器。它兼容 RV32IMAC 指令集&#xff0c;提供可观的整型性能提升以及高能效的浮点性能。E907 的主要特性包括&#xff1a;单双精度浮点单…

centos7设置时区,时间+时间同步的三种方式

centos7设置时区&#xff0c;时间时间同步的三种方式 1.centos7设置时区 1.1查看当前时区&#xff1a; timedatectl 1.2查看时间命令&#xff1a; date1.3选择时区命令 [rootlocalhost test]# tzselect Please identify a location so that time zone rules can be set co…

第五十六章 Unity 音频播放

Unity可以导入大多数标准音频文件格式&#xff0c;精通于在3D 空间中播放声音&#xff0c;还可根据需要提供其他效果。虽然播放声音是一件非常简单的事情&#xff0c;但是为了模拟现实直接中的各种声音效果&#xff0c;Unity会提供各种各样的组件来实现。 首先&#xff0c;我们…

创意无限,场景惊喜:让你的描述变成现实(Skybox Labs)

你是否曾经想象过能够用文字来创造出一个全新的世界&#xff1f;你是否曾经想过能够用一句话来生成一个令人惊叹的360天空盒&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定要试试Skybox Labs&#xff0c;这是一个由Blockade Labs开发的AI-powered解决方案&#xff0c…

最全的免费SSL证书申请方式

在SSL广泛普及的今天&#xff0c;申请一张免费的SSL证书是一件非常容易的事情。这里为大家总结当前阶段(2023年)拥有一张免费SSL证书的方式。首推的方式为来此加密网站&#xff0c;文章后面会有详细的介绍。 下面介绍几种获取免费SSL证书的方式&#xff0c;大家可以根据自己的…

【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)

这篇文章给大家介绍Nginx常用模块&#xff0c;包括Nginx目录索引&#xff0c;Nginx状态监控&#xff0c;Nginx访问控制&#xff0c;Nginx访问限制。熟悉使用模块&#xff0c;才能给Nginx增加色彩。 目录索引模块 Nginx不允许列出整个目录浏览下载&#xff0c;可以用模块自己做…

QT窗体之间值的传递,多种方法实现

QT窗体之间值的传递&#xff0c;多种方法实现 前言[1] QT窗体之间值的传递&#xff0c;多种方法实现1、新建工程2、全局变量extern3、公共成员函数public4、信号与槽singnals5、总结与工程分享主窗口.cpp文件主窗口头文件子窗口.cpp文件子窗口头文件 [2] Qt在子窗口接收父窗口的…

Node.js版本管理工具,我选择n

文件收录&#xff1a; 个人网址&#xff1a;https://linglan01.cn/ Github&#xff1a; https://github.com/CatsAndMice/blog/issues 为什么要管理Node.js版本&#xff1f;这是我们要先明白的点。 假设我电脑Node.js版本为v14.x&#xff0c;日常工作中可能会遇到以下场景&…