图灵日记之Leetcode删除有序数组中的重复项合并两个有序数组移除链表元素

题目

  • 删除有序数组中的重复项
    • 题目入口
    • 题目内容
    • 思路
    • 代码
      • c版本
      • c嘎嘎版本
  • 合并两个有序数组
    • 题目链接
    • 题目内容
    • 思路
    • 代码
      • c版本(c嘎嘎版本与c版本内容一样)
  • 移除链表元素
    • 题目链接
    • 题目内容
    • 思路1
    • 代码1
    • 思路2
    • 代码2
    • 思路3
    • 代码3

删除有序数组中的重复项

题目入口

题目内容

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

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

节选部分内容,建议看原题

思路

这种思路我之前也讲过讲过类似的双指针问题,这里指针不是真指针,而是表示数组下标的一种形象的说法

一般来说,我们要先分成两个数组模拟来思考思路的,但是本题要是先分两个数组来考虑,要用到三指针,所以再试着思考一下下一步的步骤复杂度,下一步我们是要在原数组进行思考,我们还是设立两个指针,一个叫big,另一个叫small(本人习惯,big是大哥,small是小弟).

big负责遍历数组,不对原数组进行干涉
small负责修改数组

不想好一个遍历的指针在后面判断跳出循环容易搞混的

过程就是在big指针遍历的过程中,判断small与big各自指向的元素是否相同,因为我们要找不重复的元素,所以当small和big指向的元素不相同的时候,我们要先++small,因为你不加加,small最开始指向的是第一个元素会被覆盖,所以要先++small覆盖数组第二个位置(原题的nums[1])

代码

big指针用来遍历,在代码中初始值应该是0,但是因为small和big都是第一个位置肯定相等,big++为1,这里就直接上来赋值1,也可以在思路上从第二个位置考虑,都行,这里提醒一下

c版本

int removeDuplicates(int* nums, int numsSize) 
{int big = 1;int small = 0;while(big<numsSize){if(nums[big]!=nums[small])nums[++small] = nums[big];big++;} return small+1;
}

c嘎嘎版本

class Solution {
public:int removeDuplicates(vector<int>& nums) {int big = 1;int small = 0;while(big<nums.size()){if(nums[big]!=nums[small]){nums[++small] = nums[big];}big++;}return small+1;}
};

合并两个有序数组

题目链接

题目内容

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

思路

最终排序的有序数组要在nums1中进行,本题我们采用从后往前的对两个数组进行遍历挑选,采用从前往后的思路是要挪动数据的,时间复杂度就上来了,而且麻烦,所有我们不妨换种思路,从后往前来考虑
我们从后往前考虑要注意对两个数组边界进行考虑,无非是nums1数组有效元素遍历完或者nums2有效元素遍历完
第一种情况:nums1有效元素遍历完,nums2仍然有剩余元素,所以我们继续从后往前在nums1数组进行覆盖即可
第一个数组指向的动态下标我们叫end1,第二个叫end2,在end1后面是我们处理过的元素,end1前面是未处理的元素,又因为本身数组的有序,所以在我们遍历完后,即便end2的数据覆盖完,end1没走到0位置,也是非递减排序
第二种情况:nums2遍历完,我刚才说过两个数组都是有序数组,所以在nums2遍历之后nums1已经是非递减状态,可以自己尝试画图看一下

代码

c版本(c嘎嘎版本与c版本内容一样)

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

移除链表元素

题目链接

题目内容

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

思路1

第一种思路就是最直接的思路删除,而单链表的删除要记得站在本节点的上一个才能对本节点进行删除,所以我们要处理两个问题,第一个要在针对节点时分情况讨论头节点和其他节点的问题,第二个我前面提过要站在节点前面才能对本节点进行修改所以我们要使用两个动态指针来标记前一个节点和该节点

代码1

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode*  big=head,*small=NULL;//big还是本人习惯的方式,大哥指针,用来//遍历链表,small就是小弟指针,用来记录前一个//节点的地址while(big){//第一层判断就是判断big指针里的数值//是不是所要删除的数值//如果是的就进行删除操作//不是的话就跳进下一个if(big->val==val){//第二层循环判断头节点等于删除数值的情况//如果是头节点是删除数值会直接跳入这个//循环,不会让small小弟指针记录//当然,头节点也没有前节点,所以就要//特殊考虑if(small==NULL){//head头节点是删除数据的情况下//你还要更新头节点,让头节点//指向下一个节点//此处可以解决一直出现删除数据的//情况,比如你要删除1,然后数据给的//是1 1 1 2,这个代码可以一直把头节点//更新到第一个头节点非删除值得情况big = head->next;free(head);head=big;}else {//删除操作small->next = big->next;free(big);big=small->next;}}else {small=big;big=big->next;}}return head;
}   

思路2

链表删除

使用tail指针来遍历链表
tail判断是不是删除的对应数值,如果是就跳过,如果不是就把next指针指向他,并跳到下一个节点
newnode作为新链表(删除后的链表)
newnode赋值的是head的地址,刚开始newnode指向的就是原链表,为了方便理解,所以我把在录视频的时候分成两个部分来更好的理解这个思路

代码2

struct ListNode* removeElements(struct ListNode* head, int val) 
{struct ListNode* newnode=NULL,* tail=NULL;while(head!=NULL){if(head->val==val){/*当节点指向的是被删除的对象时,就要跳过这个节点,指向下一个节点来达到删除的目的*/head=head->next;}else {/*在链表不是空链表时,对newnode初始化,指向原链表*/if(newnode==NULL){newnode=head;tail=newnode;}else {/*在head指向不是删除元素的时候,用tail进行连接该节点,并跳到下一个节点          */tail->next=head;tail=tail->next;}/*head指向下一个节点tail的next指针要置为空,因为这个思路是让newnode指向新链表新的头节点,利用tail不断向后遍历链表来连接非删除值得节点,而你tail最后一个不置为NULL,那么在调用该函数得时候,无法判断该链表的结束节点,tail->next最后一次变成野指针*/head=head->next;tail->next=NULL;}}head=newnode;return head;
}

思路3

第三种思路与第一种思路类似,是先对头节点的情况来讨论,然后让头节点是一个非删除值的节点,然后进行正常的删除操作

代码3

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val) 
{
//判断是不是空链表if(head==NULL) return head;//非空链表解决一连串的删除值头节点的情况while(head->next!=NULL&&head->val==val){head=head->next;}//看看在删除完一连串删除值头节点的情况下,//是否是空链表if(head->next==NULL&&head->val==val)return NULL;//头节点非删除值的节点,开始正常的删除操作struct ListNode* p = head;while(p->next){if(p->next->val==val){struct ListNode* tem = p->next;p->next = tem->next;free(tem);}else{p = p->next;}}return head; 
}

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

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

相关文章

抖音ip地址切换什么原因

在如今的互联网世界中&#xff0c;抖音已经成为了一个非常受欢迎的应用程序&#xff0c;让人们可以通过短视频来分享生活点滴。然而&#xff0c;有时候我们可能会遇到一些问题&#xff0c;比如在使用抖音时需要进行IP地址切换。那么&#xff0c;为什么要切换IP地址呢&#xff1…

拼多多买家页面批量导出订单excel

拼多多买家页面批量导出订单excel 由于拼多多不支持订单导出excel清算起来很麻烦&#xff0c;就自己写了一个页面批量导出脚本代码。 首先打开拼多多手机端网站&#xff1a;https://mobile.pinduoduo.com/ 登录后点击我的订单打开f12审查元素 在控制台引入jquery&#xff0c;引…

IIC需要外部上拉电阻

由于I2C接口采用Open Drain机制&#xff0c;器件本身只能输出低电平&#xff0c;无法主动输出高电平&#xff0c;只能通过外部上拉电阻RP将信号线拉至高电平。 因此I2C总线上的上拉电阻是必须的&#xff01; 所以开发板上面的IIC如果没有外接上拉电阻&#xff0c;是无法使用该I…

【go语言开发】本地缓存的使用,从简单到复杂写一个本地缓存,并对比常用的开源库

本文主要介绍go语言中本地缓存的使用&#xff0c;首先由简单到复杂手写3个本地缓存示例&#xff0c;使用内置的sync&#xff0c;map等数据结构封装cache&#xff0c;然后介绍常见的一些开源库&#xff0c;以及对比常用的开源库 文章目录 前言手写本地缓存CacheNormalCacheExCac…

halcon3

*外焊缝检测 *读取图片 *遍历文件夹 list_files (D:/D程序/外焊缝方案/碳钢方 - 外/30000, files, Files) *文件格式筛选 tuple_regexp_select (Files, .*, ImageFiles) *依次读取图片 for I := 1 to |ImageFiles|-1 by 1 read_image (Image, ImageFiles[I]) dev_close_windo…

基于单片机的太阳能数据采集系统(论文+源码)

1. 系统设计 在本次太阳能数据采集系统的设计中&#xff0c;以AT89C52单片机为主要核心&#xff0c;主要是由LCD液晶显示模块、存储模块、温度检测模块、串口通信模块&#xff0c;光照检测模块等组成&#xff0c;其实现了对太阳能板的温度&#xff0c;光照强度的检测和记录&…

SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法

AND 运算符 SQL的AND运算符用于根据多个条件筛选记录&#xff0c;确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法&#xff1a; SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND condition3 ...; • column1, column2,等是您…

SpringBoot2—开发实用篇3

目录 整合第三方技术 缓存 SpringBoot内置缓存解决方案 SpringBoot整合Ehcache缓存 SpringBoot整合Redis缓存 SpringBoot整合Memcached缓存 SpringBoot整合jetcache缓存 SpringBoot整合j2cache缓存 任务 Quartz Task 邮件 消息 Java处理消息的标准规范 购物订单…

git 常见错误总结(会不断更新中。。)

常见错误 1. 配置部署key后git clone还是拉不下代码 执行以下命令 先添加 SSH 密钥到 SSH 代理&#xff1a; 如果你使用 SSH 代理&#xff08;例如 ssh-agent&#xff09;&#xff0c;将生成的私钥添加到代理中。 ssh-add ~/.ssh/gstplatrontend/id_rsa如果报错以下错误信息…

详谈前端中常用的加/密算法

本文主要详细介绍了在前端开发中常用的加/解密算法&#xff0c;以及前端如何实现。 总的来说&#xff1a;前端加密无论使用哪个加密都一样是有可能性被他人获取到相关的公钥或密钥的&#xff08;比如&#xff1a;拦截请求、查看源代码等&#xff09;&#xff0c;然后进行加密与…

pytorch--基于语音的性别识别

pytorch官网 基于梅尔频谱的语音性别分类模型&#xff0c;训练了20epoch&#xff0c;准确率97% 提升点有很多&#xff1a;还可以基于声纹特征作为训练集、数据预处理的逻辑、transform的逻辑&#xff08;修改transform会导致数据的张量维度变更&#xff0c;可能需要更改模型结…

风速预测(五)基于Pytorch的EMD-CNN-LSTM模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-LSTM模型预测 3.1 数据加载&…

中医处方软件西医电子处方系统,一键生成处方单可设置配方模板教程

一、前言 有的诊所是中医和西医都有&#xff0c;医师是全科医师&#xff0c;那么所使用的软件既要能开中药处方也要能开西药处方&#xff0c;而且可以通过一键生成配方&#xff0c;则可以节省很多时间。 下面就以 佳易王诊所卫生室电子处方为例说明 如上图&#xff0c;如果是…

151.翻转字符串里的单词

题目描述 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1: 输入: "the sky is blue" 输出: "blue is sky the"示例 2: 输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多…

【C++】POCO学习总结(十七):日志系统(级别、通道、格式化、记录流)

【C】郭老二博文之&#xff1a;C目录 1、Poco::Message 日志消息 1.1 说明 所有日志消息都在Poco::Message对象中存储和传输。 头文件&#xff1a;#include “Poco/Message.h” 一条消息包含如下内容&#xff1a;优先级、来源、一个文本、一个时间戳、进程和线程标识符、可选…

Kafka中的fetch-min-size、fetch-max-wait和request.timeout.ms配置

当前kafka的版本为2.8.11&#xff0c;Spring Boot的版本为2.7.6&#xff0c;在pom.xml中引入下述依赖&#xff1a; <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.11<…

非暴力沟通-情绪篇

我相信&#xff0c;如果我们能够问自己两个问题&#xff0c;我们将会看到&#xff0c;惩罚永远不会以建设性的方式让我们的需要真正得到满足。 第一个问题&#xff1a; 你想要对方去做哪些和现在不一样的事情呢&#xff1f; 如果我们之问这一个问题&#xff0c;可能有时候看上…

vue3组件的基本结构

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…

微服务组件Sentinel的学习(2)

限流规则 流控模式直接模式关联模式链路模式 流控效果快速失败warm up排队等待 热点参数限流 流控模式 添加限流规则&#xff0c;可点击高级选项&#xff0c;有三种流控模式选择&#xff1a; 直接:统计当前资源的请求&#xff0c;触发闻值时对当前资源直接限流&#xff0c;也是…

Axure之动态面板轮播图

目录 一.介绍 二.好处 三.动态面板轮播图 四.动态面板多方式登录 五.ERP登录 六.ERP的左侧菜单栏 七.ERP的公告栏 今天就到这了哦&#xff01;&#xff01;&#xff01;希望能帮到你了哦&#xff01;&#xff01;&#xff01; 一.介绍 Axure中的动态面板是一个非常有用的组…