数组相关的面试OJ题

目录

1.移除元素

方法1【暴力求解】

方法2【双指针】

2.删除两个有序数组中的重复项

方法1【双指针】

3.合并两个有序数组

方法1【暴力求解】

方法2【开辟新数组】---选择较小的尾插 

方法3【三指针】---选择较大的头插

4.有序数组的合并

方法1【三指针】 


写一个算法代码需要考虑:起始条件,中间过程,结束条件

1.移除元素

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

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

方法1【暴力求解】

时间复杂度:O(N^2)

  • 起始条件:遍历开始
  • 中间过程:遍历数组中找到元素val,从后向前依次覆盖需要删除的元素val
  • 结束条件:遍历数组完成

易错:

  • 向前覆盖之后,循环变量一定要--,和数组元素个数也要--
int removeElement(int* nums, int numsSize, int val)
{int i = 0;for (i = 0; i < numsSize; i++){if (nums[i] == val){int j = i;while (j < numsSize){nums[j] = nums[j + 1];j++;}numsSize--;i--;}}return numsSize;
}
//OJ上是错误的❌
//首先遍历数组一遍找到元素,从后向前依次覆盖需要删除的元素


方法2【双指针】

时间复杂度:O(N) 

  • 起始条件:使用两个 下标dst src (其中dst存储不移除的元素,src遍历数组找到移除元素)
  • 中间过程:num[src] 如果不是val,就将元素赋值给dst;如果是val,就src++ ,后面这个元素会被覆盖
  • 结束条件:遍历数组完成

易错: 

  • 返回的是修改之后的数组元素个数 dst  (画画图就可以理解了why?dst+1)
int removeElement(int* nums, int numsSize, int val)
{int src=0;int dst=0;while(src<numsSize){if(nums[src] != val){nums[dst++]=nums[src++];}else{src++;}}return dst;
}
//这里使用的是下标
//那指针呢?
//用辅助数组也可以,具体情况看题目要求

2.删除两个有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。
  • 非严格递增排列 == 非递减排列  !=  乱序排列

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为1,2。不需要考虑数组中超出新长度后面的元素。

方法1【双指针】

  时间复杂度:O(N)

  • 起始条件:使用两个 下标dst src (其中dst存储不移除的元素,src遍历数组找到移除元素)
  • 中间过程:dst == src 相等的时候,不把元素放入dst中(无效位置后期可以覆盖),src++;dst != src不相等,把元素放入dst中。
  • 结束条件:遍历数组完成
  • 思想:不相等的放到src里面,相等就dst++,这样达到一个把相等的值覆盖的作用。相等的时候才会拉开差距,才有无效位置可以覆盖。

易错:

  • 特别提醒:dst是下标,返回最后数组元素的时候需要+1 (对比上面)
int removeDuplicates(int* nums, int numsSize)
{int dst=1;int src=0;while(dst<numsSize){if(nums[src] != nums[dst]){src++;nums[src]=nums[dst];dst++;}else{dst++;
//为什么这里src++移动到需要覆盖的位置,因为dst和src还要比较
//可以想下三指针怎么搞!}}return src+1;//易错
}
//数据下标
//指针呢?
//三个指针?
//用辅助数组也可以但是没必要


3.合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

方法1【暴力求解】

时间复杂度:O(N^2) 

  • 起始条件 
  • 中间过程:先合并在nums1,再冒泡排序
  • 结束条件
  • 这个方法效率低下:排序最快的 快速排序时间复杂度O(nlogN)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int i=0;for(i=0;i<n;i++){nums1[m+i]=nums2[i];}//排序for(i=0;i<n+m;i++){int j=0;for(j=0;j<n+m-1-i;j++){if(nums1[j]>nums1[j+1]){int tmp=nums1[j];nums1[j]=nums1[j+1];nums1[j+1]=tmp;}}}}

方法2【开辟新数组】---选择较小的尾插 

 时间复杂度 O(N)

  • 起始条件:设置三个下标p1 p2 j
  • 中间过程:p1 p2 比较,较小的放到 j(指向新数组开头)里面, p1 p2正序遍历两个数组,最后拷贝回去。
  • 结束条件:两个数组都遍历完成

易错: 

  • 变长数组或动态内存开辟的数组空间 
  • p1=m  p2=n   j=m+n
  • 循环条件写的 j>0
  • 循环条件p2>=0 || p1>=0
  • 结束条件考虑周全p1< 0  或 p2 < 0的处理
  • 循环条件里面是循环继续的条件


方法3【三指针】---选择较大的头插

时间复杂度 O(N)

  • 起始条件:设置三个下标p1 p2 j
  • 中间过程:p1 p2 比较,较大的放到 j(指向nums1的最后)里面, p1 p2倒叙遍历两个数组
  • 结束条件:两个数组都遍历完成

易错:

  • p1=m  p2=n   j=m+n
  • 循环条件写的 j>0
  • 循环条件p2>=0 || p1>=0
  • 结束条件考虑周全p1< 0  或 p2 < 0的处理
  • 循环条件里面是循环继续的条件

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int p1=m-1;int p2=n-1;//下标和元素个数的关系int j=m+n-1;while(p2>=0&&p1>=0){if(nums1[p1]<nums2[p2]){nums1[j--]=nums2[p2];p2--;}else//p1>p2{nums1[j--]=nums1[p1];p1--;}}while(p2>=0){nums1[j--]=nums2[p2--];}
}

 【整个思路】:

【详解】:

【结束条件】:


4.有序数组的合并

描述:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:输入包含三行,
第一行:包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行:包含n个整数,用空格分隔。
第三行:包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并

示例1
输入: 5 6
            1 3 7 9 22
            2 8 10 17 33 44
输出: 1 2 3 7 8 9 10 17 22 33 44 

大家还记得这个题目吗?在我们数组题目当中也是讲解过暴力求解的方法。这里我们可以使用三指针的方法自己写一写。                    

      操作符&算数转换题_唐唐思的博客-CSDN博客                                                                           

方法1【三指针】 


✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正! 

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

Git extension 中合并工具kdiff3乱码问题

打开kdiff3合并工具&#xff0c;setting->region settings 设置下面的编码格式为utf-8就可以啦&#xff01; 注意&#xff1a;需要在合并工具中设置编码格式&#xff0c; 在git 中配置编码格式没有效果

人工智能AI创作系统ChatGPT网站系统源码+AI绘画系统支持GPT4.0/支持Midjourney局部重绘

一、前言 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建…

Leetcode刷题详解——组合

1. 题目链接&#xff1a;77. 组合 2. 题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[…

归并排序(c语言代码实现)

归并排序&#xff08;稳定的排序&#xff09;&#xff1a; 归并排序是一种分治策略的排序算法&#xff0c;其基本思想是将待排序数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;然后合并这两个已经排序好的子数组&#xff0c;最终得到完整的已排序数组…

Sentinel黑白名单授权规则解读

目录 基本介绍 代码实战 架构说明 RequestOriginParser的实现类 网关添加请求头 配置授权规则 基本介绍 授权规则可以对请求方来源做判断和控制。 很多时候&#xff0c;我们需要根据调用来源来判断该次请求是否允许放行&#xff0c;这时候可以使用 Sentinel 的来源…

酒水展示预约小程序的效果如何

酒的需求度非常高&#xff0c;各种品牌、海量经销商组成了庞大市场&#xff0c;而在实际经营中&#xff0c;酒水品牌、经销商、门店经营者等环节往往也面临着品牌传播拓客引流难、产品展示预约订购难、营销难、销售渠道单一等痛点。 那么商家们应该怎样解决呢&#xff1f; 可以…

31.Map集合用法、遍历、排序与常见API

概要&#xff1a; java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。 Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对&#xff08;称作“键”和“值”&#xff09;&#xff0c;其中每个键映射到一个值。 本文主要介绍java ma…

如何使用VSCode来查看二进制文件

2023年11月6日&#xff0c;周一下午 目录 方法1&#xff1a;安装插件Binary Viewer然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"HEX"方法2&#xff1a;安装插件Binary然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"B" 方法1&…

C-DS二叉树_另一棵树的子树

Description 给你两棵二叉树tree1和tree2,检验tree1中是否包含和tree2具有相同结构和结点值的子树。如果存在,输出true;否则,输出false。 Input 第一行输入t,表示有t个测试样例。 第二行首先输入n1,接着输入n1个整数,表示二叉树tree1。 第三行首先输入n2,接着输入n…

Vite 的基本原理,和 webpack 在开发阶段的比较

目录 1&#xff0c;webpack 的流程2&#xff0c;Vite 的流程简单编译 3&#xff0c;总结 主要对比开发阶段。 1&#xff0c;webpack 的流程 开发阶段大致流程&#xff1a;指定一个入口文件&#xff0c;对相关的模块&#xff08;js css img 等&#xff09;先进行打包&#xff0…

【Unity基础】7.动画状态参数

【Unity基础】7.动画状态参数 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;创建动画状态 (1) 创建动画状态 不好意思各位~最近工作比较忙&#xff0c;稍微耽误了这两周的博客。话…

Hydra post登录框爆破

文章目录 无token时的Hydra post登录框爆破带Token时的Hydra post登录框爆破 无token时的Hydra post登录框爆破 登录一个无验证码和token的页面&#xff0c;同时抓包拦截 取出发送数据包&#xff1a;usernameadb&password133&submitLogin 将用户名和密码替换 userna…

项目部署文档

申请SSL证书 先申请,用免费的 下载证书 先将下载下来的保存起来 服务器安装JDK: 创建develop目录 mkdir /usr/local/develop/ 把JDK压缩包上传到/usr/local/develop/目录 解压安装包 并且将安装到指定目录 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /us…

CMake重要指令常用变量

什么是CMake? 没有使用CMake和使用CMake构建的区别&#xff1f; CMake的基本语法 语法格式&#xff1a; 指令(参数1 参数2...)赋值操作 如 把hello.cpp 赋值给变量HELLO set(HELLO hello.cpp)取变量的值&#xff1a; ${HELLO}但在if控制语句中是直接使用变量名。 if(HEL…

lazarus:数据集快速导出为excel、csv、sql及其他多种格式

lazarus被成为快速开发工具&#xff0c;为什么说“快速”&#xff0c;重要的一点是&#xff0c;很多工具是现成的&#xff0c;可以拿来直接就用。比如数据导出&#xff0c;如果需要把数据集导出为excel格式文件&#xff0c;写代码可能需要很多时间。lazarus就不用了&#xff0c…

Java连接Redis并操作Redis中的常见数据类型

目录 一. Java连接Redis 1. 导入依赖 2. 建立连接 二. Java操作Redis的常见数据类型存储 1. Redis字符串(String) 2. Redis哈希(Hash) 3. Redis列表&#xff08;List&#xff09; 4. Redis集合&#xff08;Set&#xff09; 一. Java连接Redis 1. 导入依赖 pom依赖…

外汇天眼:全员免费,赢奖金!

外汇市场一直以来都是金融投资者的热门领域之一&#xff0c;但对于新手来说&#xff0c;了解和掌握外汇交易可能需要时间和经验。为了帮助新手入门&#xff0c;提高交易技能&#xff0c;外汇模拟交易应运而生。为的是能够零风险无压力地帮助外汇投资者更好地掌握外汇交易的技巧…

【GEE】4、 Google 地球引擎中的数据导入和导出

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 如何将您自己的数据集引入 GEE。如何将来自遥感数据的值与您自己的数据相关联。如何从 GEE 导出特征。 2背景 了解动物对环境的反应对于了解如何管理这些物种至关重要。虽然动物被迫做出选择以满足其基本需求&am…

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现&#xff08;通用&#xff09;4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序&#xff0c;由于网上找到的驱动方法良莠不齐&#xff0c;笔者在实现时序过…

【SQL篇】一、Flink动态表与流的关系以及DDL语法

文章目录 1、启动SQL客户端2、SQL客户端常用配置3、动态表和持续查询4、将流转为动态表5、用SQL持续查询6、动态表转为流7、时间属性8、DDL-数据库相关9、DDL-表相关 1、启动SQL客户端 启动Flink&#xff08;基于yarn-session模式为例&#xff09;&#xff1a; /opt/module/f…