【算法】代码随想录之数组

news2024/9/21 10:29:27

文章目录

前言

一、二分查找法(LeetCode--704)

二、移除元素(LeetCode--27)

三、有序数组的平方(LeetCode--977)

四、长度最小的子数组(LeetCode--209)

五、螺旋矩阵II(LeetCode--59)


前言

跟随代码随想录,学习数组相关的算法题目,记录学习过程中的tips。


一、二分查找法(LeetCode--704)

【1】算法功能:在有序数组中,查找指定元素,时间复杂度为O(log N)。

【2】算法思想:定义首尾指针分别指向数组的首尾元素,若中间元素的值小于目标值则将首指针移动至中间元素右侧,若中间元素的值大于目标值则将尾指针移动至中间元素的左侧,若相等则返回下标。

【3】代码实现:在左闭右闭的区间内查找。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size() - 1;
        while (low <= high) {
            int mid = (low + high) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return -1;
    }
};

【4】易错点:①注意while循环的判定条件;②注意high的更新条件。


二、移除元素(LeetCode--27)

在之前的刷题中已经遇到过,且代码随想录的解法与当时我的初次解法相同,见【LeetCode算法】第27题:移除元素-CSDN博客。


三、有序数组的平方(LeetCode--977)

【1】题目描述:

【2】解决思想:首先,找到正负元素的分界线,利用双指针法来解决。i指针指向最后一个负元素,j指针指向第一个正元素。每次比较i和j元素的大小,谁小就加入目标数组中。i指针向左移动,j指针向右移动。

【3】C++代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> ret;//最终返回的数组
        //找到首个>=0的元素(分界线)
        int k = 0;
        int len = nums.size();
        while (k < len && nums[k] < 0) {
            ++k;
        }
        //双指针法:i从k处往左,j从k处往右
        int i = k - 1, j = k;
        while (i >= 0 || j < len) {
            if (i < 0) {
                ret.push_back(nums[j] * nums[j]);
                ++j;
            } else if (j >= len) {
                ret.push_back(nums[i] * nums[i]);
                --i;
            } else if (abs(nums[i]) < abs(nums[j])) {
                ret.push_back(nums[i] * nums[i]);
                --i;
            } else {
                ret.push_back(nums[j] * nums[j]);
                ++j;
            }
        }
        return ret;
    }
};

【4】时间复杂度:O(N)。

【5】空间复杂度:O(1),不算目标数组ret。


四、长度最小的子数组(LeetCode--209)

【1】题目描述:

【2】解决思想:滑动窗口。定义两个指针分别指向滑动窗口的起始位置和终止位置。在主循环中,让终止位置不断后移,每次后移均加上扫过的元素值。当累加值大于等于目标值时,循环缩小起始位置(为了找到最小的数组长度)。

【3】C++代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int i = 0;//滑动窗口起始位置
        int sum = 0;
        int ret = INT_MAX;
        //j指向滑动窗口的终止位置
        for (int j = 0; j < nums.size(); ++j) {
            sum += nums[j];
            //循环缩小窗口的起始位置
            while (sum >= target) {
                ret = min(ret, j - i + 1);
                sum -= nums[i++];
            }
        }
        return ret == INT_MAX? 0 : ret;
    }
};

【4】时间复杂度:O(N)。

【5】空间复杂度:O(1)。

【6】启示:当在一个样本空间中寻找一组满足某些条件的连续的子空间时,可以考虑采用滑动窗口方法。


五、螺旋矩阵II(LeetCode--59)

【1】题目描述:

【2】解决思想:如下图所示,每一圈分为四种情况来处理:最上面、最右面、最下面、最左面。同时,每次处理每一条边的时候都遵循左闭右开原则(处理最左边节点,不处理最右边节点),使得每一条边的处理规则都一致。转的圈数是n/2,当n为奇数时最后需要额外添加最中间的一个洞。

【3】C++代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> ret(n, vector<int>(n, 0));
        int startX = 0, startY = 0;//起始点位置
        int offset = 1;//每转一圈,偏移量+1
        int count = 1;//填入数组中的值
        int circleNum = n / 2;//转的圈数
        for (int k = 0; k < circleNum; ++k) {
            int i, j;
            //第一条边:最上面
            for (j = startY; j < n - offset; ++j) 
                ret[startX][j] = count++;
            //第二条边:最右面
            for (i = startX; i < n - offset; ++i)
                ret[i][j] = count++;
            //第三条边:最下面
            for (; j > startY; --j)
                ret[i][j] = count++;
            //第四条边:最左面
            for (; i > startX; --i)
                ret[i][j] = count++;
            startX++;
            startY++;
            offset++;
        }
        //维度为奇数时,填中间的一格
        if (n % 2 == 1)
            ret[startX][startY] = count;
        return ret;
    }
};

【4】时间复杂度:O(N^2)

【5】空间复杂度:O(1),不算存储数据的数组。

【6】启示:针对模拟转圈的场景,找到一致性的处理规则很关键。

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

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

相关文章

LLM:tokenizer分词器概念

在做nlp时&#xff0c;首先要对文本进行分词&#xff0c;也就是给定一个句子&#xff0c;将其归到词表中的一系列token上&#xff0c;token有对应的数字&#xff08;token_id&#xff09;。 上图是bert的分词器的json内容&#xff0c;可以看到词表是一个字典&#xff0c;key为t…

电脑显示MSVCR110.dll丢失怎么办,总结5种靠谱的解决方法

在使用电脑过程中&#xff0c;部分用户可能会遇到MSVCR110.dll文件丢失的问题&#xff0c;具体表现为弹出提示窗口&#xff0c;指出缺失该文件&#xff0c;导致部分程序无法正常启动。小编将为您介绍多种解决该问题的指南。 一、找不到MSVCR110.dll是什么情况 MSVCR110.dll是M…

2.线性回归

简化的房价模型 假设1&#xff1a;影响房价的关键因素时卧室个数&#xff0c;卫生间和居住面积&#xff0c;记为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​ 假设2&#xff1a;成交价时关键因素的加权和&#xff1a; y w 1 x 1 w 2 x 2 w 3 x 3 b y w_1x_1w_2x_2w_3x…

在 IVS 2024 加密盛会上开拓创新:CESS 引领去中心化云存储和 CD²N 之发展

作为基于区块链的去中心化云存储网络和 CDN 基础设施网络&#xff0c;CESS 在日本年度加密创业大会 IVS 2024 上成为焦点&#xff01;此次活动在历史悠久的京都举办&#xff0c;围绕“跨越边界”这一主题&#xff0c;吸引了超过15,000 名参会者&#xff0c;其中包括 3,000 创始…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥证明介绍及算法规格】

密钥证明介绍及算法规格 HUKS为密钥提供合法性证明能力&#xff0c;主要应用于非对称密钥的公钥的证明。 基于PKI证书链技术&#xff0c;HUKS可以为存储在HUKS中的非对称密钥对的公钥签发证书&#xff0c;证明其公钥的合法性。业务可以通过系统提供的根CA证书&#xff0c;逐级…

Python数据分析-Excel和 Text 文件的读写操作

1.Excel和 Text 文件的读写操作 1. Text 文件读写包 import sys print(sys.argv[0]) print(__file__) print(sys.path[0]) qopen(sys.path[0] "\out.txt","w",encodingutf-8) q.write(这个是测试一下) q.close() print(done)open 语句可以打开的创建text…

DR模式介绍

DR模式 lvs的三种模式 nat&#xff1a;地址转换 DR模式&#xff1a;直接路由模式 tun&#xff1a;隧道模式 DR模式的特点 调度器在整个lvs集群当中是最重要的&#xff0c;在nat模式下&#xff0c;即负责接受请求&#xff0c;同时根据负载均衡的算法转发流量&#xff0c;响…

OceanBase 社区版,搭建,安装,部署

这是阿里的数据库&#xff0c;因为我目前在杭州&#xff0c;所以企业用这个的比较多。 我看的版本是V4.3.1 官网概述解读 我看的是社区版 他是分布式关系型数据库&#xff0c;支持事务。兼容mysql语法&#xff0c;支持水平扩展&#xff0c;LSM数据压缩。 社区版&#xff0…

ROS的TF系统

一、SLAM 1、SLAM全称是Simultaneous Localization And Mapping&#xff0c;即同时定位与地图构建 2、SLAM软件包Hector_Mapping&#xff0c;←建图可参考链接所示文章 二、机器人定位 1、假设机器人开始建图的位置是地图坐标系的原点 2、则机器人在建图过程中的位置可以描…

qml:Material风格下改变控件的颜色

用过Material的都知道&#xff0c;所有控件的默认颜色是玫红色&#xff0c;如果要改变颜色&#xff0c;只需要加一句代码即可&#xff1a;Material.accent: "blue" 你可以将这句写在顶层&#xff0c;那就是所有颜色都改了&#xff0c;如果你单独写在某个控件下&…

【linux】Shell 脚本中的 For 循环详细用法教程

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Elasticsearch详细介绍

B站对应视频&#xff1a; Elasticsearch01-01.为什么学习elasticsearch_哔哩哔哩_bilibili 大多数日常项目&#xff0c;搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的&#xff0c;存在很多问题。 首先&#xff0c;查询效率较低。 由于数据…

类和对象(初)

目录 一、面向过程和面向对象初步认识 二、类的引入 命名规则 三、类的定义 四、访问限定符 五、类的作用域 六、类的实例化 七.类对象模型 一、面向过程和面向对象初步认识 1.C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;…

开发个人Ollama-Chat--5 模型管理 (二)

开发个人Ollama-Chat–5 模型管理 (二) ChatGPT 这是该项目的最终效果&#xff0c;使用ollama的open-webui进行人与机器的对话功能&#xff0c;对话的后端服务则完全对接自己开发的Go项目。 如何实现呢&#xff1f;则通过这篇文章&#xff0c;一一给大家剖析后端的原理及功能…

【进阶篇-Day8:JAVA中递归、异常的介绍】

目录 1、递归的介绍和使用1.1 递归的介绍1.2 案例案例一&#xff1a;案例二&#xff1a;案例三&#xff1a;案例四&#xff1a; 1.3 总结 2、异常的介绍和使用2.1 异常的介绍&#xff1a;&#xff08;1&#xff09;能够看懂异常&#xff08;2&#xff09;异常的体系接口和分类&…

fortran快速排序算法,示例对一维数组进行排序

fortran快速排序算法&#xff0c;示例对一维数组进行排序 0. 引言1. 快速排序方法(QuickSqrt)代码实现2. 结语 0. 引言 快速排序&#xff08;QuickSort&#xff09;是一种常用的排序算法&#xff0c;采用分治策略实现。它的基本思想是通过一趟排序将待排序的数据分割成独立的两…

[笔试训练](三十六)106:提取不重复的整数107:哈夫曼编码108:abb

目录 106:提取不重复的整数 107:哈夫曼编码 108:abb 106:提取不重复的整数 题目链接:提取不重复的整数_牛客题霸_牛客网 (nowcoder.com) 题目: ​ 题解: #include <iostream> #include <string> using namespace std; int n0; int cnt[10]; int ret0; int mai…

MySQL CONCAT函数的简单使用

CONCAT函数用于将mysql中查询多列的值拼成一列显示&#xff0c; 使用示例&#xff1a; SELECT CONCAT(attr_name,"&#xff1a;",attr_value) FROM pms_sku_sale_attr_value WHERE sku_id1; 上面SQL语句使用CONCAT函数将attr_name、attr_value两列的值拼成一列&am…

【代码随想录】【算法训练营】【第62天】 [卡码108]冗余连接 [卡码109]冗余连接II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 62&#xff0c;又是一个周一&#xff0c;ding~ 题目详情 [卡码108] 冗余连接 题目描述 卡码108 冗余连接 LeetCode类似题目684 冗余连接 解题思路 前提&#xff1a; 思路&#xff1a; 重点&a…

如何对odoo17网站cookies进行配置(How to configure cookies for Odoo 17 website?)

浏览器cookies具有缓存和加速的作用&#xff0c;odoo17 website 模块内置了cookies的选项: &#xff08;Browser cookies have the function of caching and acceleration, and the Odoo 17 website module has built-in options for cookies:&#xff09; 1、安装website模块后…