代码随想录 算法训练 Day1:数组

题目一:

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4     

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2     
输出: -1        
解释: 2 不存在 nums 中因此返回 -1        

提示:

  • 你可以假设 nums 中的所有元素是不重复的。
  • n 将在 [1, 10000]之间。
  • nums 的每个元素都将在 [-9999, 9999]之间。

题目二:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

答案:

/*** 数组算法实现类* 包含二分查找和移除元素的不同实现方法*/
public class Array {/*** 二分查找方法一:左闭右闭区间实现 [left, right]* * @param nums 有序数组* @param target 目标值* @return 目标值在数组中的索引,如果不存在则返回-1*/public static int BinarySearch1(int[] nums, int target) {// 左闭右闭二分法 [left, right]int length = nums.length;int left = 0;                  // 查找区间左边界int right = length - 1;        // 查找区间右边界// 当left <= right时,区间[left, right]有效while (left <= right) {int mid = (left + right) / 2;  // 计算中间位置if (nums[mid] == target) {return mid;                 // 找到目标值,返回索引} else if (nums[mid] < target) {left = mid + 1;            // 目标在右半部分,缩小左边界} else {right = mid - 1;           // 目标在左半部分,缩小右边界}}return -1;  // 未找到目标值}/*** 二分查找方法二:左闭右开区间实现 [left, right)* * @param nums 有序数组* @param target 目标值* @return 目标值在数组中的索引,如果不存在则返回-1*/public static int BinarySearch2(int[] nums, int target) {// 左闭右开二分法 [left, right)int length = nums.length;int left = 0;              // 查找区间左边界int right = length;        // 查找区间右边界(注意这里是length而非length-1)// 当left < right时,区间[left, right)有效while (left < right) {int mid = (left + right) / 2;  // 计算中间位置if (nums[mid] == target) {return mid;                 // 找到目标值,返回索引}if (nums[mid] < target) {left = mid + 1;            // 目标在右半部分,缩小左边界} else {right = mid;               // 目标在左半部分,缩小右边界(注意这里是mid而非mid-1)}   }return -1;  // 未找到目标值}/*** 移除元素方法一:暴力解法* 时间复杂度:O(n²),空间复杂度:O(1)* * @param nums 数组* @param target 要移除的目标值* @return 移除元素后数组的新长度*/public static int RemoveElement1(int[] nums, int target) {// 暴力解法:遍历数组,发现目标元素后,将后面的所有元素前移一位int length = nums.length;for (int i = 0; i < length; i++) {// 找到目标元素if (nums[i] == target) {// 将后面的元素都前移一位for (int j = i; j < length - 1; j++) {nums[j] = nums[j + 1];}i--;        // 下标回退,因为当前位置的元素已被后面的元素替换,需要重新检查length--;   // 数组有效长度减1}}return length;  // 返回新数组的长度}/*** 移除元素方法二:双指针法* 时间复杂度:O(n),空间复杂度:O(1)* * @param nums 数组* @param target 要移除的目标值* @return 移除元素后数组的新长度*/public static int RemoveElement2(int[] nums, int target) {// 双指针法:快指针遍历数组,慢指针指向新数组的当前位置int length = nums.length;int slow = 0;    // 慢指针,指向新数组下一个要填充的位置// 快指针遍历整个数组for (int fast = 0; fast < length; fast++) {// 当前元素不是目标值时,将其放入slow位置if (nums[fast] != target) {nums[slow] = nums[fast];slow++;   // 慢指针前进}// 当前元素是目标值时,快指针前进,慢指针不动,相当于跳过了这个元素}return slow;  // 返回新数组的长度}/*** 主方法,用于测试*/public static void main(String[] args) {// 测试二分查找int[] num1 = {-1, 0, 3, 5, 9, 12};int target1 = 6;int ans = BinarySearch2(num1, target1);System.out.println("二分查找结果索引: " + ans);// 测试移除元素int[] num2 = {0, 1, 2, 2, 3, 0, 4, 2};int target2 = 2;int ans2 = RemoveElement2(num2, target2);System.out.println("移除元素后的数组长度: " + ans2);// 打印移除元素后的数组内容System.out.print("移除元素后的数组: ");for (int i = 0; i < ans2; i++) {System.out.print(num2[i] + " ");}}
}

感悟:

工作好几年了,来学学算法进修一下。

当年找工作就没好好看算法,也这么逃过来了,现在一看算法就害怕。

这几题主要靠ai辅助写出来的(汗颜),第一遍刷先降低要求,能自己敲一遍正确算法,能理解算法即可。

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

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

相关文章

容器技术 20 年:颠覆、重构与重塑软件世界的力量

目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合​ 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重&#xff0c;到操作系统虚拟…

集成钉钉消息推送功能

1. 概述 本文档详细描述了在若依框架基础上集成钉钉消息推送功能的开发步骤。该功能允许系统向指定钉钉用户发送文本和富文本消息通知。 2. 环境准备 2.1 钉钉开发者账号配置 登录钉钉开发者平台&#xff1a;https://open.dingtalk.com/创建/选择企业内部应用获取以下关键信…

【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀

文章目录 &#x1f9f3; 访问者模式&#xff08;Visitor Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;游戏物品系统&#xff09;1. 定义元素与访问者接口2. 实现具体元素类3. 实现具体访问者4. 对象结构管理5. 客户端使用 …

SQL:MySQL函数:日期函数(Date Functions)

目录 时间是数据的一种类型 &#x1f9f0; MySQL 常用时间函数大全 &#x1f7e6; 1. 获取当前时间/日期 &#x1f7e6; 2. 日期运算&#xff08;加减&#xff09; &#x1f7e6; 3. 时间差计算 &#x1f7e6; 4. 格式化日期 &#x1f7e6; 5. 提取时间部分 &#x1f7…

【MySQL】数据表更新数据

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 数据更新基础1.1 更新操作的重要性1.2 更新语句基本结构1.3 更新操作注意事项 2. 基本更新操作2.1 基本UPDATE语法2.2 使用表达式更新数据2.3 使用LIMIT限制更新行数2.4 NULL值处理 3. 高级更新技术3.1 使用子…

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分&#xff0c;它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进&#xff0c;手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用&#xff0c;本分享数据可帮助分析移动通信网络的发展和优化。本次数据…

蓝桥杯12届国B 纯质数

题目描述 如果一个正整数只有 1 和它本身两个约数&#xff0c;则称为一个质数&#xff08;又称素数&#xff09;。 前几个质数是&#xff1a;2,3,5,7,11,13,17,19,23,29,31,37,⋅⋅⋅ 。 如果一个质数的所有十进制数位都是质数&#xff0c;我们称它为纯质数。例如&#xff1…

腾讯多模态定制化视频生成框架:HunyuanCustom

HunyuanCustom 速读 一、引言 HunyuanCustom 是由腾讯团队提出的一款多模态定制化视频生成框架。该框架旨在解决现有视频生成方法在身份一致性(identity consistency)和输入模态有限性方面的不足。通过支持图像、音频、视频和文本等多种条件输入&#xff0c;HunyuanCustom 能…

力扣top100 矩阵置零

开辟数组来标记元素为0的行和列&#xff0c;然后将对应的行和列的元素全部置为0&#xff1b; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …

Python知识框架

一、Python基础语法 变量与数据类型 变量命名规则 基本类型&#xff1a;int, float, str, bool, None 复合类型&#xff1a;list, tuple, dict, set 类型转换与检查&#xff08;type(), isinstance()&#xff09; 运算符 算术运算符&#xff1a;, -, *, /, //, %, ** 比较…

华为OD机试真题——单词接龙(首字母接龙)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)

一、系统介绍 本智能商城系统是基于当今主流技术栈开发的一款多端商城解决方案&#xff0c;主要包括微信小程序前端、SpringBoot 后端服务以及 Vue 管理后台三大部分。系统融合了线上商城的核心功能&#xff0c;支持商品浏览、下单、支付、订单管理等操作&#xff0c;适用于中小…

Python笔记:c++内嵌python,c++主窗口如何传递给脚本中的QDialog,使用的是pybind11

1. 问题描述 用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本为2.13.6 网上说在python脚本中直接用PySide2自带的QWinWidget&#xff0c;如from PySide2.QtWinExtras import QWinWidget&#xff0c;但我用的版本中说没有QWinWidget&#x…

软考软件设计师中级——软件工程笔记

1.软件过程 1.1能力成熟度模型&#xff08;CMM&#xff09; 软件能力成熟度模型&#xff08;CMM&#xff09;将软件过程改进分为以下五个成熟度级别&#xff0c;每个级别都定义了特定的过程特征和目标&#xff1a; 初始级 (Initial)&#xff1a; 软件开发过程杂乱无章&#xf…

C# SQLite基本使用示例

目录 1 基本使用流程 1.1 步骤1&#xff1a;添加SQLite依赖 1.2 ​步骤2&#xff1a;建立连接 1.3 步骤3&#xff1a;执行SQL命令 1.4 步骤4&#xff1a;查询数据 1.5 步骤5&#xff1a;使用事务 2 SQLite基本使用示例 2.1 准备工作 2.2 完整示例 2.3 案例代码解析 …

视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解

引言 在数字图像与视频压缩领域&#xff0c;离散余弦变换&#xff08;Discrete Cosine Transform, DCT&#xff09;凭借其卓越的能量集中特性&#xff0c;成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域&#xff0c;分离出DC系数&#xff08;直流分量&…

对抗系统熵增:从被动救火到主动防御的稳定性实战

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

java 中 DTO 和 VO 的核心区别

DTO 和 VO 的核心区别 特性DTO&#xff08;数据传输对象&#xff09;VO&#xff08;视图对象&#xff09;设计目的服务层与外部系统&#xff08;如前端、其他服务&#xff09;之间的数据传输为前端展示层定制数据&#xff0c;通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…

数据结构【二叉树的遍历实现】

&#x1f4d8;考研数据结构基础&#xff1a;二叉树的存储、遍历与队列辅助实现详 在数据结构的学习中&#xff0c;二叉树作为一种结构清晰、应用广泛的树形结构&#xff0c;是考研计算机专业课中重点内容之一。本文将以实际代码为基础&#xff0c;介绍二叉树的存储结构、遍历方…

无人机俯视风光摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!

调色详情 无人机俯视风光摄影 Lr 调色是利用 Adobe Lightroom 软件&#xff0c;对无人机从俯视角度拍摄的风光照片进行后期处理的调色方式。通过调整色彩、对比度、光影等多种参数&#xff0c;能够充分挖掘并强化画面独特视角下的壮美与细节之美&#xff0c;让原本平凡的航拍风…