【数据结构刷题】数组oj

news2024/11/18 20:02:32
前言:
	本文章是关于在力扣上面的数组相关面试题的讲解,包括:
	1.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1),
	2.删除排序数组中的重复项。
	3. 合并两个有序数组。

一.原地移除数组中所有的元素val

题目:
https://leetcode.cn/problems/remove-element/

1.1时间复杂度为O(N^2),空间复杂度为O(1)

写一段原地移除数组中所有的元素val,要求时间复杂度为O(N^2),空间复杂度为O(1)的代码实现:
思路:遇到这个val后面的元素往前面覆盖。
在这里插入图片描述

  int removeElement(int* nums, int numsSize, int val) {
    int i, j;
    int newSize = numsSize;

    for (i = 0; i < newSize; i++) {
        if (nums[i] == val) {
            for (j = i; j < newSize - 1; j++) {
                nums[j] = nums[j + 1];
            }
            newSize--;
            i--; // 重复检查当前位置
        }
    }

    return newSize; } 

int main() {
int nums[] = { 0, 1, 2, 2, 3, 0, 4, 2 };
int numsSize = sizeof(nums) / sizeof(nums[0]);
int val = 2;

int newSize = removeElement(nums, numsSize, val);

printf("修改后的数组: ");
for (int i = 0; i < newSize; i++) {
    printf("%d ", nums[i]);
}

return 0; } 

1.2时间复杂度为O(N),空间复杂度为O(N)

写一段原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(N)的代码实现:
思路:
在这里插入图片描述

#include <stdlib.h> int* removeElements(int* nums, int numsSize, int val, int* newSize) {
     int i, j;
    		 int* tmp = (int*)malloc(numsSize * sizeof(int)); // 创建一个临时数组
     int count = 0; // 计数器,记录移除元素后的数组长度
   	  for (i = 0; i < numsSize; i++) {
         if (nums[i] != val) {
             tmp[count] = nums[i]; // 将非 val 元素保存到临时数组
             count++;
         }
     }
 
    *newSize = count; // 更新新数组的长度
 
    return tmp; // 返回临时数组的指针
     }

int main() {
    int nums[] = { 0, 1, 2, 2, 3, 0, 4, 2 };
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    int val = 2;

    int newSize;
    int* newArray = removeElements(nums, numsSize, val, &newSize);

    printf("移除元素后的数组: ");
    for (int i = 0; i < newSize; i++) {
        printf("%d ", newArray[i]);
    }
    printf("\n新长度: %d\n", newSize);

    free(newArray); // 释放临时数组的内存

    return 0; } ```

1.3符合此题的正确写法:

原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1):

写法2与这篇文章的唯一的区别是本文章需要return j,其余部分一样,而写法1的大致思路画图思路相差不大,就不用动图演示了,传送门–>序列中删除指定数字,有动图演示
图解:
在这里插入图片描述

#include<stdio.h>
/写法一
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;
}
//写法二
int removeElement(int* nums, int numsSize, int val){
      int i=0;
      int j=0;
      for(i=0;i<numsSize;i++)
      {
       if(nums[i]!=val)
      {
        nums[j++]=nums[i];
      }
      }
        return j;
}

int main() {
int nums[] = { 0, 1, 2, 2, 3, 0, 4, 2 };
int sz =sizeof(nums) / sizeof(nums[0]);
int val = 2;
int ret=removeElement(nums, sz, val);
printf(“%d”,ret);
}

二. 删除排序数组中的重复项。

题目:
https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

动图演示:

在这里插入图片描述

#include<stdio.h>
int removeDuplicates(int* nums, int numsSize) {
	int src = 1, dst = 0;
	while (src < numsSize)
	{
		if (nums[src] != nums[dst])
		{
			nums[++dst] = nums[src++];
		}
		else
		{
			src++;
		}
	}
	return dst+1;//因为dst是下标,所以要+1
}

int main()
{
	int nums[] = { 0,0,1,1,1,2,2,3,3,4 };
	int sz = sizeof(nums) / sizeof(nums[0]);
	int ret=removeDuplicates(nums, sz);
	printf("%d", ret);
}

执行:
在这里插入图片描述

三. 合并两个有序数组

题目:
https://leetcode.cn/problems/merge-sorted-array/

思路:无论是下面哪种情况,nums1数组都是目标数组,都是长的那个。
要是end2先结束,那就不用拷贝到目标数组nums1,直接打印nums1即可
若是end1先结束,需要先把nums2(短数组的元素)拷贝到nums1,再打印

3.1end1>0,end2<0

在这里插入图片描述

3.2end1<0,end2>0

在这里插入图片描述

代码实现:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
       int end1=m-1;
       int end2=n-1;
       int i=m+n-1;
    while(end1>= 0&& end2>=0)
    {    
    if(nums1[end1]>nums2[end2])
      {
        nums1[i--]=nums1[end1--];
      }        
      else
      {
          nums1[i--]=nums2[end2--];
      }
    }
    while(end2>=0)
    {
    nums1[i--]=nums2[end2--];
    }
    
}

执行:
在这里插入图片描述
文章到这就写完了,如有错误欢迎指正,谢谢!

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

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

相关文章

RT-Thread系列09——Finsh自定义命令

文章目录 1. 无参数命令2. 带参数命令2.1. 字符串参数2.2. 数字型参数 >>> 文章汇总&#xff08;有代码汇总&#xff09; <<< 目标&#xff1a;使用Finsh自定义命令。 RT-Thread studio&#xff0c;版本: 2.2.6。RT-Thread&#xff1a;标准版&#xff0c;4…

《Java-SE-第三十二章》之模拟实现HTTP服务器

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

Flask实现接口mock,安装及使用教程(一)

1、什么是接口mock 主要是针对单元测试的应用&#xff0c;它可以很方便的解除单元测试中各种依赖&#xff0c;大大的降低了编写单元测试的难度 2、什么是mock server 正常情况下&#xff1a;测试客户端——测试——> 被测系统 ——依赖——>外部服务依赖 在被测系统和…

CVE漏洞复现-CVE-2021-3493 Linux 提权内核漏洞

CVE-2021-3493 Linux 提权内核漏洞 漏洞描述 CVE-2021-3493 用户漏洞是 Linux 内核中没有文件系统中的 layfs 中的 Ubuntu over 特定问题&#xff0c;在 Ubuntu 中正确验证有关名称空间文件系统的应用程序。buntu 内核代码允许低权限用户在使用 unshare() 函数创建的用户命名…

象棋中“马”的题目(深搜)

题面 题目描述 中国象棋半张棋盘如图&#xff08;a&#xff09;所示。马自左下角往右上角跳。 今规定只许往右跳&#xff0c;不许往左跳&#xff0c;且要求马跳的方式按照&#xff08;b&#xff09;图顺时针深度优先递归。比如图&#xff08;a&#xff09;中所示为一种跳行路线…

使用动态规划实现错排问题-2023年全国青少年信息素养大赛Python复赛真题精选

[导读]&#xff1a;超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲&#xff0c;这是超平老师解读Python编程挑战赛真题系列的第15讲。 全国青少年信息素养大赛&#xff08;原全国青少年电子信息智能创新大赛&#xff09;是“世界机器人大会青少年机器人设…

Netty:服务端通过ServerBootstrap的childHandler函数设置处理客户端的ChannelHandler

说明 服务端通过io.netty.bootstrap.ServerBootstrap启动&#xff0c;ServerBootstrap的 childHandler(ChannelHandler childHandler)函数用于增加处理客户端的ChannelHandler。这个childHandler一般是ChannelInitializer的子类&#xff0c;用于配置ChannelPipeline&#xff0…

GD32F103VE串口与DMA传输

GD32F103VE串口与DMA传输&#xff0c;本测试采用的的串口1和DMA0之间的数据传输&#xff0c;然后通过RS485和其它设备进行数据交换&#xff0c;没有采用任何中断参与。 GD32F103VE的DMA0请求映射到串口&#xff1a; 1&#xff0c;USART0_RX映射到DMA0的通道4&#xff0c;USART…

springboot 多模块 每个模块进行单独打包

springboot项目目录结构 打包模块需要进行的配置 配置文件引入打包插件 <build><finalName>api</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifac…

APT80DQ40BG-ASEMI快恢复二极管APT80DQ40BG

编辑&#xff1a;ll APT80DQ40BG-ASEMI快恢复二极管APT80DQ40BG 型号&#xff1a;APT60DQ20BG 品牌&#xff1a;ASEMI 封装&#xff1a;TO-3P 恢复时间&#xff1a;≤50ns 正向电流&#xff1a;80A 反向耐压&#xff1a;400V 芯片个数&#xff1a;双芯片 引脚数量&…

MySQL|查看事务加锁情况

文章目录 使用information_schema数据库中的表获取锁信息INNODB_TRXINNODB_LOCKSINNODB_LOCK_WAITS 使用SHOW ENGINE INNODB STATUS获取信息补充 使用information_schema数据库中的表获取锁信息 在information_schema数据库中&#xff0c;有几个与事务和锁紧密相关的表 INNOD…

回归预测 | MATLAB实现K折交叉验证GRNN广义回归神经网络多输入单输出回归预测

回归预测 | MATLAB实现K折交叉验证GRNN广义回归神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现K折交叉验证GRNN广义回归神经网络多输入单输出回归预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 回归预测 | MATLAB实现K折交叉验证GRNN广义回归神经…

MySQL高阶知识点(一) 一条 SQL查询语句是如何被执行的

一条 SQL查询语句是如何被执行的 MySQL 的基本架构示意图如下所示&#xff1a;

MySQL分析查询语句Explain

1概述 ​ 定位了查询慢的SQL之后&#xff0c;就可以使用EXPLAIN或者DESCRIBE工具做针对性的分析查询。两者使用方法相同&#xff0c;并且分析结果也是相同的。 ​ MySQL中有专门负责SQL语句优化的优化器模块&#xff0c;主要功能是计算分析系统中收集到的统计信息&#xff0c…

生信豆芽菜-limma差异分析使用说明

网站&#xff1a;http://www.sxdyc.com/diffLimmaAnalyse 一、limma简介 什么是limma&#xff1f; 首先要明白&#xff0c;不管哪种差异分析&#xff0c;其本质都是广义线性模型。 limma也是广义线性模型的一种&#xff0c;其对每个gene的表达量拟合一个线性方程。 limma的分析…

模拟实现消息队列项目(系列8) -- 实现MqClient

目录 前言 1. 创建ConnectionFactory 2. Connection 和 Channel 的定义 2.1 Connection 2.2 Channel 3. 封装请求响应读写操作 3.1 写入请求 3.2 读取响应 3.3 Connection中创建Channel 4. 封装发送请求的操作 4.1 创建Channel 4.2 阻塞等待服务器响应 4.3 添加响应信息到 basi…

【构造】CF1798 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 首先如果 a 全是 00&#xff0c;那么显然无解。 否则考虑从左到右构造新数列&#xff0c;维护新数列的前缀和 s。 如果 s≥0&#xff0c;则在剩余未加入的数中随便选择一个非正数添加到新数列末尾。如果 s<…

Semantic Kernel 入门系列:Memory内存

了解的运作原理之后&#xff0c;就可以开始使用Semantic Kernel来制作应用了。 Semantic Kernel将embedding的功能封装到了Memory中&#xff0c;用来存储上下文信息&#xff0c;就好像电脑的内存一样&#xff0c;而LLM就像是CPU一样&#xff0c;我们所需要做的就是从内存中取出…

视频声音怎么转换成文字?这四种转换方法很简单

将视频声音转换成文字的好处不仅仅限于方便记录、保存和查阅视频内容。它还可以大大提高视频内容的可访问性和可搜索性&#xff0c;使得非母语人士、听力障碍者等人群更容易理解视频内容&#xff0c;并且可以更快速地找到相关信息。此外&#xff0c;将视频声音转换成文字还可以…

ArcGISPro随机森林自动化调参分类预测模型展示

更改ArcGISPro的python环境变量请参考文章 ArcGISPro中如何使用机器学习脚本_Z_W_H_的博客-CSDN博客 脚本文件如下 点击运行 结果展示 负类预测概率 正类预测概率 二值化概率 文件夹&#xff08;模型验证结果&#xff09; 数据集数据库 ROC曲线 由于个人数据量太少所以…