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

文章目录

前言

一、二分查找法(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;//每转一圈,偏移量+1int 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.mzph.cn/web/44386.shtml

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

相关文章

花几千上万学习Java,真没必要!(二)

1、注释&#xff1a; java代码注释分3种&#xff1a; 单行注释&#xff1a;//注释信息 多行注释: /*注释信息*/ 文档注释:/**注释信息*/ public class TestComments {// 这是单行注释&#xff0c;用于注释单行代码或解释代码功能/* 这是多行注释&#xff0c;用于注释多行代码…

Kotlin runCatching try-catch耗时比较

Kotlin runCatching try-catch耗时比较 fun main(args: Array<String>) {val lists arrayListOf("z")val idx 10/***纳秒统计** ns&#xff08;nanosecond&#xff09;&#xff1a;纳秒。一秒的10亿分之一&#xff0c;10的-9次方秒。*   1纳秒0.000001 毫秒…

基于实现Runnable接口的java多线程

Java多线程通常可以通过继承Thread类或者实现Runnable接口实现。本文主要介绍实现Runnable接口的java多线程的方法, 并通过ThreadPoolTaskExecutor调用执行&#xff0c;以及应用场景。 一、应用场景 异步、并行、子任务、磁盘读写、数据库查询、网络请求等耗时操作等。 以下…

笔记:在Entity Framework Core中如何处理多线程操作DbContext

一、目的&#xff1a; 在使用Entity Framework Core (EF Core) 进行多线程操作时&#xff0c;需要特别注意&#xff0c;因为DbContext类并不是线程安全的。这意味着&#xff0c;你不能从多个线程同时使用同一个DbContext实例进行操作。尝试这样做可能会导致数据损坏、异常或不可…

C语言排序之快速排序

快速排序是一种高效的排序算法。它采用了分治的策略&#xff0c;通过选择一个基准元素&#xff0c;将待排序的序列划分为两部分&#xff0c;一部分的元素都比基准元素小&#xff0c;另一部分的元素都比基准元素大&#xff0c;然后对这两部分分别进行快速排序&#xff0c;从而实…

前端开发工具

Lodash 有普通的 CommonJS 版本&#xff08;通常称为 lodash&#xff09;和 ES6 模块版本&#xff08;称为 lodash-es&#xff09;。它们的主要区别包括&#xff1a; 模块化&#xff1a;lodash 是传统的 CommonJS 模块&#xff0c;可使用 require 或 import 引入&#xff1b;lo…

2024年,搞AI就别卷模型了

你好&#xff0c;我是三桥君 2022年11月30日&#xff0c;OpenAI发布了一款全新的对话式通用人工智能工具——ChatGPT。 该工具发布后&#xff0c;仅用5天时间就吸引了100万活跃用户&#xff0c;而在短短2个月内&#xff0c;其活跃用户数更是飙升至1亿&#xff0c;成为历史上增…

ARP协议介绍与ARP协议的攻击手法

ARP是什么&#xff1f; ARP是通过网络地址&#xff08;IP&#xff09;来定位机器MAC地址的协议&#xff0c;它通过解析网络层地址&#xff08;IP&#xff09;来找寻数据链路层地址&#xff08;MAC&#xff09;的网络传输协议。 对个定义不能理解的话&#xff0c;可以结合 TCP/I…

《恋与深空》2.0上线肉鸽模式,乙游玩家会买账吗?

乙游和肉鸽&#xff0c;看似八竿子打不着的两个赛道&#xff0c;被叠纸给融合起来了。 根据《恋与深空》官方消息&#xff0c;即将在7月15日更新的2.0交错视界版本中&#xff0c;会上线全新常驻玩法“混沌深网”&#xff0c;配置高随机性Roguelike模式&#xff0c;并搭载了管理…

理想文档发布了~一个集合了多个优秀开源项目的在线云文档

两年前我做了一个简单的在线云文档项目&#xff0c;选择了开源的思维导图、白板、流程图、幻灯片等项目&#xff0c;在它们基础上添加了云存储的功能&#xff0c;然后写了一个简单的工作台管理文件夹和文件&#xff1a; 放在了自己的个人网站上使用&#xff0c;同时写了一篇水文…

【Leetcode 每日一题】349. 两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums…

[web]-代码审计-运维失误

打开页面可以看到如下&#xff1a; 1、查看源代码&#xff0c;发现验证码功能是正常生成的随机的&#xff0c;输入也没有过滤&#xff0c;无法采用爆破。 2、根据题目提示运维失误&#xff0c;使用dirsearch扫描&#xff0c;发现提交的地址check.php, 使用php5、.bak可以打开&…

2.The DispatcherServlet

The DispatcherServlet Spring的Web MVC框架与许多其他Web MVC框架一样&#xff0c;是请求驱动的&#xff0c;围绕一个中央Servlet&#xff08;即DispatcherServlet&#xff09;设计&#xff0c;该Servlet将请求分派给控制器&#xff0c;并提供其他功能以促进Web应用程序的开发…

创建I/O文件fopen

#include〈stdio.h〉 int mian(int argc,char *argv[]){ FILE *fp;//结构体fp fpfopen&#xff08;“1.txt”&#xff0c;“r”&#xff09;; }

程序的控制结构——if-else语句(双分支结构)【互三互三】

目录 &#x1f341; 引言 &#x1f341;if-else语句&#xff08;双分支结构&#xff09; &#x1f449;格式1&#xff1a; &#x1f449;功能&#xff1a; &#x1f449;程序设计风格提示&#xff1a; &#x1f449;例题 &#x1f449;格式2&#xff1a; &#x1f449;…

Monaco 使用 ColorProvider

Manco 中可以使用调色板对色值进行修改&#xff0c;首先看一下调色版效果。 调色板是 Monaco-Editor 中一个特别的组件&#xff0c;通过两个方法实现呼出调色板&#xff0c;provideColorPresentations 显示调色窗口&#xff0c;provideDocumentColors 监听页面的变更&#xff0…

如何将libwebsockets库编译为x86架构

在之前的文章中&#xff0c;我们已经详细介绍了如何交叉编译libwebsockets并将其部署到ELF 1开发板上。然而在调试阶段&#xff0c;发现将libwebsockets在Ubuntu环境下编译为x86架构可能更为方便和高效。 通过在主机环境中编译运用x86架构下的libwebsockets库&#xff0c;可以…

阿里ChatSDK使用,开箱即用聊天框

介绍&#xff1a; 效果&#xff1a;智能助理 ChatSDK&#xff0c;是在ChatUI的基础上&#xff0c;结合阿里云智能客服的最佳实践&#xff0c;沉淀和总结出来的一个开箱即用的&#xff0c;可快速搭建智能对话机器人的框架。它简单易上手&#xff0c;通过简单的配置就能搭建出对…

Flowable工作流引擎核心事件详细解释说明

Flowable工作流引擎核心事件详细解释说明 流程执行事件 需要了解全部详细事件的请看这个链接Flowable&#xff08;一个开源的工作流和业务流程管理引擎&#xff09;中与事件相关的一些核心概念 流程开始和结束事件 PROCESS_STARTED&#xff1a;标记流程实例的开始。PROCESS…

公益快报 | 中科亿海微以企业奖学金为纽带,深化校企合作

近日&#xff0c;为回报母校、激励湖南大学机器人视觉感知与控制技术国家工程研究中心广大学生&#xff0c;中科亿海微电子科技&#xff08;苏州&#xff09;有限公司&#xff08;简称“中科亿海微”&#xff09;捐赠设立企业奖学金。此项奖学金的设立标志着校企合作迈向全方位…