当前位置: 首页 > news >正文

【代码随想录】day1 数组

因为学计算机语言是属于半路出家,在接触数据结构之前,我只了解数据的类型,从没有了解过不同数据类型的存储方式。数组、链表等等因为不同的存储方式,展现出不同的优缺点,以适应不同的用途。
代码随想录是属于把饭喂到嘴里的好!里面资料对于我这种小白来说,真的是很保姆了。之前刷过一小段时间的力扣算法,但没有坚持下来,学到链表就已经放弃。这次学习给自己一个目标:
按照卡哥的进度,完成整个数据结构的主要题目,并在平台中打卡记录
这个目标是因为卡哥的教程里还包含了很多扩展和延申的题目,但是因为我时间有限,所以先打算主要过一遍,如果有机会二刷再细致来吧

二分查找

触发条件:
二分查找的主要条件是有序,只有排列有了顺序才能通过二分法减少查找次数

注意事项:
查找区间**[a,b]还是[a, b)**
我个人还是比较熟悉**[a, b)这种方法右等左加**

具体代码:

class Solution:def search(self, nums: List[int], target: int) -> int:left, right = 0, len(nums)  # 定义target在左闭右开的区间里,即:[left, right)while left < right:  # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <middle = left + (right - left) // 2if nums[middle] > target:right = middle  # target 在左区间,在[left, middle)中elif nums[middle] < target:left = middle + 1  # target 在右区间,在[middle + 1, right)中else:return middle  # 数组中找到目标值,直接返回下标return -1  # 未找到目标值

移除元素

触发条件:
空间复杂度为O(1)(即原地移除,不能构建新的数组),移除val值后的数组大小

注意事项:
有两种方法可以解决下列问题:
①暴力法: 2个for (一个原数组、一个新数组)、O(n^2)的时间复杂度

// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
class Solution {
public:int removeElement(vector<int>& nums, int val) {int size = nums.size();for (int i = 0; i < size; i++) {if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位for (int j = i + 1; j < size; j++) {nums[j - 1] = nums[j];}i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位size--; // 此时数组的大小-1}}return size;}
};

②双指针法:快指针找元素、慢指针定位置,O(n)的时间复杂度

// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {if (val != nums[fastIndex]) {nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
};

虽然我更熟悉python,但是感觉这里C++的代码更有感觉,更好理解

以下是我的python代码:

class Solution:def removeElement(self, nums: List[int], val: int) -> int:slowindex = 0fastindex = 0num_long = len(nums)while fastindex < num_long:if val != nums[fastindex]:nums[slowindex] = nums[fastindex]slowindex += 1fastindex += 1 return slowindex

相关文章:

  • springboot读取自定义配置
  • 2024年3月认证通用基础考试问答题及答案
  • Leetcode算法题
  • 低密度奇偶校验码LDPC(七)——SPA和积译码算法的简化
  • week06day01 mysql
  • Spring: spring中SSE的实现方式有哪些
  • 学习java第一天(下载并配置环境+写第一个java程序)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • Vue2:用node+express写一个轻量级的后端服务
  • 大唐杯学习笔记:Day5
  • Swing程序设计(11)动作事件监听器,焦点事件监听器
  • Docker Compose实战指南:让容器管理变得简单而强大
  • 集成2.5G/5G/10G高速率网络变压器的RJ45网口连接器产品特点介绍
  • 从零开始在kitti数据集上训练yolov5
  • AWS虚拟机迁移到Azure上的实战操作
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • DOM的那些事
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • HTML5新特性总结
  • k8s如何管理Pod
  • leetcode98. Validate Binary Search Tree
  • npx命令介绍
  • SQLServer之索引简介
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 对JS继承的一点思考
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 京东美团研发面经
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端面试之闭包
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 入口文件开始,分析Vue源码实现
  • 深度学习入门:10门免费线上课程推荐
  • 事件委托的小应用
  • 小程序 setData 学问多
  • ​io --- 处理流的核心工具​
  • ​Spring Boot 分片上传文件
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (4)事件处理——(7)简单事件(Simple events)
  • (a /b)*c的值
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十六)一篇文章学会Java的常用API
  • (四)c52学习之旅-流水LED灯
  • (学习日记)2024.01.19
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net 中viewstate的原理和使用
  • .NET建议使用的大小写命名原则
  • .NET上SQLite的连接
  • @Resource和@Autowired的区别
  • [\u4e00-\u9fa5] //匹配中文字符
  • [Android Studio 权威教程]断点调试和高级调试
  • [Android]使用Retrofit进行网络请求