代码随想录算法训练营第一天|数组理论基础、704二分查找、27移除元素

数组理论基础

一维数组

  1. 数组中的元素在内存空间中是连续的
  2. 数组名与数组中第一个元素的地址相同(一维数组)
  3. 数组的下标从0开始
  4. 删除数组的元素其实是用后面的元素覆盖掉要删除的元素
  5. 数组的长度不能改变

二维数组

  1. 二维数组是按照行存储的,也是连续的
  2. 将二维数组看作是一维数组的一维数组
  3. 二维数组就是指针组成的数组,可以用二级指针表示
int arr[2][3] = {{1,2,3},{4,5,6}}
// 首先将二维数组arr看作元素是arr[0],arr[1]的一维数组
arr // 二维数组arr的起始地址
arr[i] // 第i行一维数组的数组名,代表该一维数组的首元素地址,即第一个元素arr[i][0]的地址  =*(arr+i)
arr[i]+j // 代表arr[i][j]的地址,即&(arr[i][j])
*(arr[i]+j) // 代表arr[i][j]
arr[i][j]  // 代表arr[i][j]
arr+i // 代表二维数组中第i行数组的地址
*(arr+i)  // 即arr[i],第i行第0列的地址
*(arr+i)+j // 即&(arr[i][j])
*(*(arr+i)+j) // 即arr[i][j]

如果难以理解,可以看看在一维数组中的情况:

int arr[3]={1,2,3}
arr[1] // 代表了a[1]的值,即2
arr+1 // 代表了a[1]的地址,即&a[1]
*(arr+1) // 代表了a[1]的值,即2

704 二分查找

题目链接:二分查找

思路

暴力解法

如果这道题目的名字不是二分查找,那么拿到题目一个最直接的思路就是for循环暴力求解。

class Solution {
public:int search(vector<int>& nums, int target) {for(int i=0; i<nums.size(); i++){if(nums[i] == target){return i;}}return -1;}
};

二分解法

再一看,输入的数组是有序的,同时数组中还没有重复元素,再结合题目二分查找,便也可轻易地想到实用二分法来查找元素。自己在纸上画画,有一个二分法的伪代码。
二分法的具体实现要关注两个点:

  1. 区间问题
    到底是左闭右开区间[left,right),还是左闭右闭区间[left, right],我选择实用左闭右闭区间,因为这样看起来比较好理解,同时while条件中可以left可以等于right。
  2. 溢出问题
    这是一个小问题,计算mid时:mid = (left+right)/2,这样可能出现的一个问题是:left+right太大导致溢出。所以可以采取另一个计算方法:mid = left + (right - left) / 2,可以有效避免溢出问题。
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right){int mid = left + (right - left) / 2;if (nums[mid] == target){return mid;}else if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target){right = mid - 1;}}return -1;}
};

35 搜索插入位置

题目链接:搜索插入位置

思路

暴力解法

还是老样子,for循环,如果target等于当前元素,则返回当前下标;如果target小于当前元素,则代表该target需要插入到当前位置,返回当前下标;最后一种情况是在数组末尾添加元素,需要返回数组的长度。但是时间复杂度为O(n)

class Solution {
public:int searchInsert(vector<int>& nums, int target) {for(int i=0; i<nums.size(); i++){if(target == nums[i]){return i;}else if(target < nums[i]){return i;}}return nums.size();}
};

二分法

可以使用二分法对该元素进行查找,找到则返回下标mid,找不到则返回left(因为while条件退出时left = right + 1)。时间复杂度为O(logn)

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

27 移除元素

题目链接:移除元素

思路

暴力解法

在看完题目说明后。首先是得删除掉数组中的目标元素(在数组中删除元素本质是后继元素的覆盖),然后返回的是剩余元素的长度。使用for循环,如果当前元素等于目标元素,则: 将后续的所有元素向前移动一位(这里又要使用一个for循环),同时数组长度减一,for循环的i也减一(因为数组已经移动,当前位置的元素是之前的下一个位置的元素,还没有经过if判断)。

class Solution {
public:int removeElement(vector<int>& nums, int val) {int n = nums.size();for(int i=0; i<n; i++){if(nums[i] == val){for(int j=i+1; j<n; j++){nums[j-1] = nums[j];}n--;i--;}}return n;}  
};

双指针法

这道题不看解析想不到要用双指针法,对于什么是双指针法,现在浅显的认识也就是要有两个东西来进行处理,之前的for循环都是使用一个东西来遍历。
双指针法就是得要有两个东西来对数组进行处理,直观解释一下过程。
在这里插入图片描述
变量fast,也就是快指针,用来遍历要处理的数组;变量slow,也就是慢指针,用来对新数组的下标进行计数。

class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow = 0;for(int fast = 0; fast<nums.size(); fast++){if(nums[fast] != val){nums[slow] = nums[fast];slow++;}}return slow;
}  
};

参考链接

  1. https://book.itheima.net/course/223/1263669610003230722/1263675595644137474
  2. https://zhuanlan.zhihu.com/p/148737542
  3. https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html

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

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

相关文章

【深度学习:数据标签 】什么是数据标签?【2024】终极指南

【深度学习&#xff1a;数据标签 】什么是数据标签&#xff1f;【2024】终极指南 了解数据标记什么是数据标注&#xff1f;数据标注在机器学习中的意义 数据标签如何工作&#xff1f;标记数据与未标记数据手动数据收集开源数据集合成数据生成数据标记过程确保数据安全与合规 数…

网络安全B模块(笔记详解)- Web信息收集

Web信息收集 1.通过Kali对服务器场景Linux进行Web扫描渗透测试(使用工具nikto,查看该命令的完整帮助文件),并将该操作使用命令中固定不变的字符串作为Flag提交; Flag:nikto -H 2.通过Kali对服务器场景Linux进行Web扫描渗透测试(使用工具nikto,扫描目标服务器8080端口,…

08、Kafka ------ 消息存储相关的配置-->消息过期时间设置、查看主题下的消息存活时间等配置

目录 消息存储相关的配置★ 消息的存储介绍★ 消息过期时间及处理方式演示&#xff1a;log.cleanup.policy 属性配置 ★ 修改指定主题的消息保存时间演示&#xff1a;将 test2 主题下的消息的保存时间设为10个小时1、先查看test2主题下的配置2、然后设置消息的保存时间3、然后再…

优化 ParamValidator,让编辑器Pycharm智能提示校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 基于 Valid…

美信科技盘古信息智能车间项目成功验收,打造电子元器件数字化工厂标杆

作为一家深耕于磁性元器件领域近二十年的制造企业&#xff0c;广东美信科技股份有限公司&#xff08;以下简称“美信科技”&#xff09;始终秉承着“为电磁赋能&#xff0c;创工业至美”的企业使命&#xff0c;为中国制造卓越发展贡献力量。在当今数字化时代&#xff0c;制造企…

PanTools v1.0.11 多网盘批量管理工具 批量分享、转存、检测等等

软件介绍 一款针对热门网盘的文件管理、批量分享、批量转存、批量修改重命名、批量检测链接、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源操作&#xff0c;各种资源导出&#xff0c;并支持资源探索功能&#xff0c;优质资源一键转存保存&#…

Hive基础知识(八):Hive对数据库的增删改查操作

1. 创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment]#注释 [LOCATION hdfs_path]#指定当前库的hdfs目录 [WITH DBPROPERTIES (property_nameproperty_value,...)]; #备注创建作者和创建时间 1&#xff09;创建一个数据库&#xff0c;数据…

[笔记]学习做微信小程序

学习视频&#xff1a;前端微信小程序开发教程 本篇文章 只对关键内容笔记&#xff0c;用于自用。 这里写目录标题 注册、下载、安装我的小程序ID&#xff1a;wxe1fbd6939d8797d8我的小游戏ID&#xff1a;wx8b2c3e47ac9127b7开发者工具外观代理设置 创建第一个小程序主界面5个组…

PyTorch: torch.nn 子模块及其在循环神经网络中的应用

目录 torch.nn子模块详解 nn.utils.rnn.PackedSequence 参数说明 注意事项 示例代码 nn.utils.rnn.pack_padded_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_packed_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_sequence …

华清远见作业第二十五天——IO(第八天)

思维导图&#xff1a; 使用信号灯集完成三个进程的同步&#xff0c;A进程输出字符A&#xff0c;B进程输出字符B&#xff0c;C进程输出字符C&#xff0c;要求输出结果为ABCABCABCABCABC 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdli…

面试题-DAG 有向无环图

有向无环图用于解决前后依赖问题&#xff0c;在Apollo中用于各个组件的依赖管理。 在算法面试中&#xff0c;有很多相关题目 比如排课问题&#xff0c;有先修课比如启动问题&#xff0c;需要先启动1&#xff0c;才能启动2 概念 顶点&#xff1a; 图中的一个点&#xff0c;比…

企业用WhatsApp营销的好处有哪些?

1.建立良好的客户关系 WhatsApp是全球用户喜爱的即时通信软件&#xff0c;使用WhatsApp与客户沟通&#xff0c;可拉进企业和客户双方的距离。使用WhatsApp会话和消息推送功能&#xff0c;企业和用户可实时开展消息对话&#xff0c;及时解决客户咨询与疑虑&#xff0c;构建便捷…