数组知识点以及leetcode刷题

数组


二分查找

题目

力扣题目链接

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

适用范围

数组有序,数组中无重复元素

思路

每次找数组的中点,然后与目标值进行对比。

  • if(nums[mid] > target ) high = mid - 1
  • else if((nums[mid] < target )) low = mid + 1
  • else 找到,返回对应下标

循环终止条件判断,while(low <= high) 此时low == high有意义,所以要加等号。

代码

class Solution { public:     int search(vector<int>& nums, int target) {         //二分查找         int n = nums.size();         int left = 0, right = n - 1;                    //定义初始查找边界为左闭右闭while(left <= right){                           //等号要加上             int mid = left + (right - left)/2;          //等同于 (left+right)/2,防止数组溢出if(nums[mid] > target) right = mid - 1;     //在左半部分查找             else if(nums[mid] < target) left = mid + 1; //在右半部分查找             else return mid;                            //找到,返回对应下标         }         return -1;                                      //未找到,返回-1      } 
};//在c++的语法当中,存在内置函数进行二分的查找,在编程的时候可以采用内置函数的方法
//lower_bound(val),在数组中找到大于等于val值的第一个元素下标位置
//upper_bound(val),在数组中找到大于val值的第一个元素下标位置
//时间复杂度为O(logn)
//空间复杂度为O(1)

移除元素

题目

力扣题目链接

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

思路

数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

所以采用双指针的写法对原先的内存进行覆盖

代码

写法一
  • 定义快慢指针
    • left指针作为慢指针,用来更新元素下标,存储不等于val值的元素
    • right指针作为快指针,用来遍历数组

一次循环,只有在right指针不等于值val的情况下,left才进行移动。

class Solution { public:     int removeElement(vector<int>& nums, int val) {         //双指针,当数组下表为val的时候,left不移动,只有当数组值不为val的时候,left才进行移动int n = nums.size();         int left=0;         //left作为数组的存储下标,存储不等于val值的元素                  int right = 0;      //right作为遍历数组的下标          for(right = 0; right < n; right++){             if(nums[right] != val){                 nums[left++] = nums[right];             }         }         return left;     } 
};
// 时间复杂度:O(n) 
// 空间复杂度:O(1)
写法二

类似于快速排序的思想,左指针用来寻找等于val值的元素,右指针来寻找不等于val值的元素,然后找到之后,进行元素之间的交换,这个写法改变了元素之间的相对位置。

    class Solution { public:     int removeElement(vector<int>& nums, int val) {     /*写法二也是双指针写法,但是与第一种有些区别。左右指针,一个从头开始找元素等于val,一个从末尾开始找不是val的,然后元素之间的值进行交换*/int n = nums.size();int left = 0, right = n - 1;while(left <=  right){while(left <= right && nums[left] != val) left++;while(left <= right && nums[right] == val) right--;if(left <= right){nums[left++] = nums[right--];}}return left;}
};

有序数组的平方

题目

力扣题目链接

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

思路

双指针解法

一个指针从头开始比较,

一个指针从尾开始比较,

大的数的话,放在最后面,然后对应下标减去1,

一个指针在每次比较的时候往后移,用于计数。

代码

  • 定义左右指针
    • i指针作为左指针,比较负数的最大元素
    • j指针作为右指针,用来比较正数的最大元素
    • pos指针用来模拟下标的移动
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {//双指针解法int n = nums.size();vector<int> ans(n,0);int i = 0, j = n - 1, pos = n - 1;while(pos >= 0){if(nums[i] * nums[i] > nums[j] * nums[j]){ans[pos--] = nums[i]*nums[i];i++;}else{ans[pos--] = nums[j]*nums[j];j--;}}return ans;}
};
// 时间复杂度:O(n) 
// 空间复杂度:O(n)

长度最小的子数组

题目

力扣题目链接

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0

思路

经典滑动窗口思路题

也是类似于双指针的解法,定义两个指针leftright,分别代表滑动窗口的左右边界,同时维护一个变量sum存储子数组,也就是滑动窗口的元素之和。

  • 刚开始,leftright都指向0
  • 然后右指针不断往前走,然后num[end]加到sum
  • 如果说sum大于s,说明此时可以对左边界指针也就是left进行更新,此时获取当前最短的滑动窗口值,然后左指针不断进行移动。此时需要将已经不在滑动窗口里面的值减去
  • 不断地进行迭代,直到右指针走到了数组的末尾,就可以结束了。

代码

  • 定义左右指针
    • i指针作为左指针,作为滑动窗口的左边界
    • j指针作为右指针,作为滑动窗口的右边界
    • sum用来计算滑动窗口的总合,方便左右指针进行更新
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {//滑动窗口典型代表题目int n = nums.size();int minSize = n + 1;            //初始化滑动窗口的长度为n+1int flag = 0;int i = 0, j = 0;int sum = 0;while(j < n){sum+=nums[j++];         //右指针往后移动while(sum >= target){       //滑动窗口总和大于target时,可以求最小滑动窗口的长度,以及更新左指针minSize = min(j - i, minSize);sum -= nums[i++];       //左指针不断往后移动}}//三目运算符,如果滑动窗口的值没有进行改变的话,说明是不存在return minSize == n + 1 ? 0 : minSize;}
};

螺旋矩阵II

题目

力扣题目链接

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

思路一

  • 模拟题,这里设置了一个loop代表顺时针转了几圈,然后根据圈的数量进行模拟左右边界。

  • 模拟顺时针画矩阵的过程:

    • 填充上行从左到右
    • 填充右列从上到下
    • 填充下行从右到左
    • 填充左列从下到上
  • 这里有一个比较值得注意的点是,这里需要保持一个代码规划,就是左右边界的问题,每条边都需要遵循左闭右开的原则。

  • 还有一个需要注意的就是这里loop循环一圈是单数,所以如果n为奇数的话,会剩下最后一个中间的数没有填充,所以最后面还需要判断n是否为奇数。

代码

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> matrix(n, vector<int>(n));int i = 0, j = 0, loop = 0;int num = 1;//螺旋矩阵,最重要的几个点,根据圈数来决定是否要结束循环//每次循环的左右边界都需要确定好,是左闭右开,还是左闭右闭//圈数如果为偶数,直接循环遍历,但是如果圈数为奇数的话,就需要对最里面的一个数单独赋值while(loop < n/2){//最上面的一行,根据圈数来决定起始位置\终止位置和每圈的个数,列在增大for(i = loop; i < n-loop-1; i++)  matrix[loop][i] = num++;//最右边的一行,根据圈数来决定起始位置\终止位置和每圈的个数,行在增大for(j = loop; j < n-loop-1; j++) matrix[j][n-loop-1] = num++;//最下面的一行,根据圈数来决定起始位置\终止位置和每圈的个数,列在减小,初始值可以利用前面的ifor(;i > loop; i--)  matrix[n-loop-1][i] = num++;//最左边的一行,根据圈数来决定起始位置\终止位置和每圈的个数,行在减小,初始值可以利用前面的jfor(;j > loop; j--) matrix[j][loop] = num++;//循环完一圈,继续下一圈loop++;}//如果圈数为奇数,需要对最里面的数单独赋值if(n % 2)matrix[loop][loop] = num;return matrix;}
};

思路二

  • 设置上下左右边界,四个值进行模拟。整体理解难度和模拟难度要比思路一要简单很多,代码实现的话同样需要遵守边界一致性原则,这里采用的是左闭右闭。
  • 模拟顺时针画矩阵的过程:
    • 填充上行从左到右
    • 填充右列从上到下
    • 填充下行从右到左
    • 填充左列从下到上

代码

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> matrix(n, vector<int>(n));//模拟,设置上下左右边界,每次遍历完某一行或者某一列,边界进行换int num = 1;//设置上下左右边界int left = 0, high = 0, right = n - 1, low = n - 1;while(true){for(int i = left; i <= right; i++) matrix[high][i] = num++;if(++high > low)  break;for(int j = high; j <= low; j++) matrix[j][right] = num++;if(--right < left) break;for(int i = right; i >= left; i--) matrix[low][i] = num++;if(--low < high) break;for(int j = low; j >= high; j--) matrix[j][left] = num++;;if(++left > right) break;}return matrix;}
};

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

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

相关文章

【LeetCode】881 救生艇 中等题

给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 示例 1&#xff1a; 输入&#…

【Python机器学习】零基础掌握BaggingRegressor集成学习

如何提升回归模型的稳定性和准确性? 在实际生活中,比如房价预测,经常会遇到一种情况:有大量的特征和样本数据,但模型的预测准确度仍然不尽人意。这时候,单一的模型(如支持向量机回归)可能表现得并不够好。 考虑到这个问题,解决方案可能是使用集成方法,特别是Baggin…

系统架构师论文总结【持续更新】

系统架构师考试是对计算机从业人员&#xff0c;以考代评的重要考试&#xff0c;近几年一直在参加考试&#xff0c;屡战屡败&#xff0c;后又屡败屡战&#xff0c;记录总结论文相关的知识点&#xff0c;方便考前查看。 一、2010年论文 1&#xff09;论软件的静态演化和动态演化…

【C++ 学习】库文件和头文件编写

库文件和头文件编写 有时候&#xff0c;通过C编写的代码并不一定是直接在自己的控制台文件调用&#xff0c;而是需要在其他程序中调用编写的算法的接口即可。这个时候&#xff0c;可以把自己编写的代码打包成一个库&#xff08;Library&#xff09;&#xff0c;编译后被其他程…

宝塔Python3.7安装模块报错ModuleNotFoundError: No module named ‘Crypto‘解决办法

前言 今晚遇到一个问题&#xff0c;宝塔服务器上安装脚本的模块时&#xff0c;出现以下报错&#xff0c;这里找到了解决办法 Traceback (most recent call last):File "/www/wwwroot/unifysign/fuck_chaoxing/fuck_xxt.py", line 4, in <module>from Crypto.…

[SQL开发笔记]BETWEEN操作符:选取介于两个值之间的数据范围内的值

一、功能描述&#xff1a; BETWEEN操作符&#xff1a;选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。 二、BETWEEN操作符语法详解&#xff1a; BETWEEN操作符语法&#xff1a; SELECT column1, column2,…FROM table_nameWHERE column BETWEEN val…

基于aop 代理 Sentinel Nacos配置控制包装类实现原理

基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理 Hi&#xff0c;我是阿昌&#xff0c;今天记录下看sentinel源码结合业务实现的思路基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理&#xff1b;下面并不会手把手的记录方案的实现…

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…

分享一个用HTML、CSS和jQuery构建的漂亮的登录注册界面

作为一个前端开发人员&#xff0c;我们经常需要构建用户的登录和注册界面。一个漂亮、用户友好的登录注册界面对于提升用户体验和网站形象至关重要。以下我们使用HTML、CSS和jQuery来做一个漂亮的登录注册界面。 首先&#xff0c;我们需要创建一个html文档&#xff0c;定义登录…

【算法练习Day29】柠檬水找零根据身高重建队列用最少数量的箭引爆气球

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 柠檬水找零根据身高重建队列…

【数据结构】ST 表与 RMQ 算法

本文参考【朝夕的ACM笔记】数据结构-ST表 在练习线段树的过程中经常会感叹代码怎么这么长啊啊啊懒标记怎么这么难传啊啊啊 于是在得知有一种代码量远小于线段树的算法时、、、&#xff08;其实是因为做到了[SCOI2007] 降雨量 就是ST表啦~ 在什么情况下可以用ST表代替线段树…

Web进阶

身份认证 当我们在使用互联网时&#xff0c;经常会遇到一些需要身份验证或者保持用户状态的情况。为了实现这些功能&#xff0c;常用的方法有使用cookie、session和token。 Cookie&#xff08;HTTP Cookie&#xff09;&#xff1a; Cookie是服务器发送到用户浏览器并保存在用户…

STM32-LCD中英文显示及应用

目录 字符编码 ASCII码&#xff08;8位&#xff09; 中文编码&#xff08;16位&#xff09; GB2312标准 GBK编码 GB18030标准&#xff08;32位&#xff09; Big5编码 Unicode字符集和编码 UTF-32&#xff08;32位&#xff09; UTF-16&#xff08;16位/32位&#xff0…

二十三、设计模式之组合模式![

目录 二十三、设计模式之组合模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景理解实现角色组合模式 总结 魔战已经完结。成功登顶。占领敌军最高峰。 二十三、设计模式之组合模式 “组合模式”也被称为“部分整体模式”该…

方舟生存进化ARK个人服务器搭建教程保姆级

方舟生存进化ARK个人服务器搭建教程保姆级 大家好我是艾西&#xff0c;在很久之前我有给大家分享过方舟生存进化的搭建架设教程&#xff0c;但时间久远且以前的教程我现在回头看去在某些地方说的并不是那么清楚。最近也是闲暇无事打算重新巩固下方舟生存进化的搭建架设教程&…

Vue 路由传参和获取参数的方法

在使用 Vue 进行开发时&#xff0c;路由传参是非常常见且重要的功能。通过路由传参&#xff0c;我们可以在不同的页面之间传递数据&#xff0c;以实现更灵活的交互和功能。 Vue 提供了多种方法来实现路由传参和获取参数的操作。下面将介绍两种常用的方法&#xff1a; 1. 动态…

rpc入门笔记0x01

syntax "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name 1; // name表示名称&#xff0c;编号是1 }生成python文件 安装grpcio和grpcio-tools库 pip install grpcio #安装grpc pip install grpcio-tools #安装grpc tools生成…

LuatOS-SOC接口文档(air780E)--libcoap - coap数据处理

libcoap.new(code, uri, headers, payload) 创建一个coap数据包 参数 传入值类型 解释 int coap的code, 例如libcoap.GET/libcoap.POST/libcoap.PUT/libcoap.DELETE string 目标URI,必须填写, 不需要加上/开头 table 请求头,类似于http的headers,可选 string 请求体…

argparse模块介绍

argparse是一个Python模块&#xff1a;命令行选项、参数和子命令解析器。argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义了所需的参数&#xff0c;而 argparse 将找出如何从 sys.argv &#xff08;命令行&#xff09;中解析这些参数。argparse 模块还会自动生成…

B-3:Web安全之综合渗透测试

B-3:Web安全之综合渗透测试 任务环境说明: 服务器场景:Server2104(关闭链接) 服务器场景用户名、密码:未知 1.通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为FLAG值提交; 通过访问IP/1,查看源代码发现flagishere,访问后发现什么也没…