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

【代码训练营Day01】数组part1

文章目录

  • 数组理论基础回顾
  • 二分查找
  • 移除元素
  • 有序数组的平方

数组理论基础回顾

注意几个重点就行:

  • 一维数组普遍在内存中都是连续分配的
    • 下标从0开始
    • 删除或者增添的时候需要移动其他元素(除了尾元素)
  • 数组元素只能覆盖不会删除
    • 数组内存空间会预分配,不够会走扩容机制,结束会被gc,不会随意的减少分配

二分查找

题目链接:704. 二分查找

算法可视化图解:二分查找原理

双指针法解题思路:

  • 首先初始化前后指针,分别处于列表的两端
  • 将两指针的中间节点作为比较元素(索引相加除2,向下取整)
    • 如果比目标元素大,则将后指针移动到中间节点的前一个位置
    • 如果比目标元素小,则将前指针移动到中间节点的后一个位置
    • 如果与目标元素相同,则找到
  • 如此循环往复直到前后指针位置异常(前指针在后)

以下是结题代码:

class Solution {public int search(int[] nums, int target) {int head = 0;int end = nums.length  - 1;int middle = (head + end) / 2;while (head <= end) {if (nums[middle] < target) {head = middle + 1;middle = (head + end) / 2;}else if(nums[middle] > target) {end = middle - 1;middle = (head + end) / 2;}else {return middle;}}return -1;}
}

移除元素

题目链接:27. 移除元素

双指针法解题思路:

  • 首先将双指针都指向表头
    • head指针作为填充指针,从表头开始填充
    • end指针作为遍历指针,遍历数组
  • 开始遍历数组
    • 遇到非移除元素通过head指针填充,然后head指针后移,同时计数
    • 如果是要移除元素,则进入下一次循环
class Solution {public int removeElement(int[] nums, int val) {int head = 0;int count = 0;for (int i = 0; i < nums.length; i++) {if(nums[i] == val) {continue;}nums[head++] = nums[i];count++;}return count;}
}

有序数组的平方

题目链接:977. 有序数组的平方

此题可以暴力排序但并没有双指针法简洁,因为本题是一个有序数组,那么平方之后的最大值只可能在两端出现。

双指针法解体思路:

  • 初始化双指针指向数组的头尾,初始化一个新数组
  • 比较两指针所指元素的平方大小
    • 如果左指针的更大,则将左指针的元素平方填充到新数组,然后左指针右移
    • 如果右指针的更大,则将右指针的元素平方填充到新数组,然后右指针左移
  • 如此循环往复直到左右指针位置异常

代码如下:

class Solution {public int[] sortedSquares(int[] nums) {int head = 0;int end = nums.length -1;int[] result = new int[nums.length];int write = nums.length -1;while(head <= end) {int headNum = (int)Math.pow(nums[head],2);int endNum = (int)Math.pow(nums[end],2);if(headNum >= endNum) {result[write--] = headNum;head++;}else {result[write--] = endNum;end--;}}return result;}
}
http://www.xdnf.cn/news/9715.html

相关文章:

  • Linux进程间通信----管道
  • 人员睡岗检测算法AI智能分析网关V4打造工业/安防/交通等多场景应用方案
  • VMware安装Ubuntu实战分享大纲
  • Apifox 5 月产品更新|数据模型支持查看「引用资源」、调试 AI 接口可实时预览 Markdown、性能优化
  • 蓝牙芯片投影仪遥控器方案
  • 网络出版服务许可证年检
  • MySQL数据库学习笔记
  • openFuyao开源发布,建设多样化算力集群开源软件生态
  • 【大模型】Bert
  • 计算机网络 | 1.1 计算机网络概述思维导图
  • Nginx代理、缓存与Rewrite
  • 使用LSTM进行时间序列分析
  • 流程自动化引擎:让业务自己奔跑
  • C++031(变量的存储类型-auto变量)
  • 塔能空化泵节能方案:工厂能耗精准控制的革新之选
  • 博图SCL基础知识-寻址调用及新建SCL
  • 记一次前端逻辑绕过登录到内网挖掘
  • 计算机内存管理全解析:从基础原理到前沿技术(含分页/分段/置换算法/大页/NVM/CXL等技术详解
  • C++ explicit关键字有什么作用
  • Dify+MCP Server打造禅道AI智能助手
  • LeetCode 136:只出现一次的数字 - 巧用异或运算的极致解法
  • Open3D上可视化Nuscenes 数据集
  • 谷歌浏览器Google Chrome v137.0.7151.41 中文版本版+插件 v1.11.1
  • 【Echarts】象形图
  • : influxdb + grafana+JMeter
  • 自回归建模模型(AR)
  • C++进阶--C++11(03)
  • 一种字典树的Python实现
  • 什么是数字化转型,如何系统性重构业务逻辑
  • Android 构建系统中常见的 .mk 文件及其作用