wy的leetcode刷题记录_Day79

wy的leetcode刷题记录_Day79

声明

本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2024-3-1

前言

目录

  • wy的leetcode刷题记录_Day79
    • 声明
    • 前言
    • 2369. 检查数组是否存在有效划分
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 61. 旋转链表
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 82. 删除排序链表中的重复元素 II
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 86. 分隔链表
      • 题目介绍
      • 思路
      • 代码
      • 收获

2369. 检查数组是否存在有效划分

今天的每日一题是:2369. 检查数组是否存在有效划分

题目介绍

给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。

如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:

  • 1.子数组 恰 由 2 个相等元素组成,例如,子数组 [2,2] 。
  • 2.子数组 恰 由 3 个相等元素组成,例如,子数组 [4,4,4] 。
  • 3.子数组 恰 由 3 个连续递增元素组成,并且相邻元素之间的差值为 1 。例如,子数组 [3,4,5] ,但是子数组 [1,3,5] 不符合要求。
    如果数组 至少 存在一种有效划分,返回 true ,否则,返回 false 。

示例 1:
输入:nums = [4,4,4,5,6]
输出:true
解释:数组可以划分成子数组 [4,4] 和 [4,5,6] 。这是一种有效划分,所以返回 true 。

示例 2:
输入:nums = [1,1,1,2]
输出:false
解释:该数组不存在有效划分。

思路

动态规划,令数组的长度为n,它至少存在一个有效的划分取决于它的子状态:

  • 1.前(n-2)个元素存在有效的划分,并且后俩个元素相等
  • 2.前(n-2)3个元素存在有效的划分,并且后三个元素相等或者后三个元素呈递增

于是我们使用一个数组dp[n+1]来记录前n个元素是否存在有效划分。初始化全为false,dp[0]为true。状态转移方程为

 bool euqal=(nums[i-1]==nums[i-2])&(nums[i-1]==nums[i-3]);//判断相等bool continuous=(nums[i-1]-nums[i-2]==1)&(nums[i-2]-nums[i-3]==1);//判断递增dp[i]=(dp[i-2]&(nums[i-2]==nums[i-1]))||(dp[i-3]&&(euqal||continuous));

代码

class Solution {
public:bool validPartition(vector<int>& nums) {int n=nums.size();vector<bool> dp(n+1,false);dp[0]=true;for(int i=1;i<=n;i++){if(i>=2){dp[i]=dp[i-2]&(nums[i-2]==nums[i-1]);}if(i>=3){bool euqal=(nums[i-1]==nums[i-2])&(nums[i-1]==nums[i-3]);bool continuous=(nums[i-1]-nums[i-2]==1)&(nums[i-2]-nums[i-3]==1);dp[i]=dp[i]||(dp[i-3]&&(euqal||continuous));}}return dp[n];}
};

收获

稳固了动态规划的知识。

61. 旋转链表

61. 旋转链表

题目介绍

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:
在这里插入图片描述

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:
在这里插入图片描述
输入:head = [0,1,2], k = 4
输出:[2,0,1]

思路

本题其实跟博主以前做过的题有点类似,就是数组循环右移,不过换成了链表,同样也是老套路。首先我们先得到链表长度为n,然后根据k%n得到实际上所需的右移次数k(节省了多余重复的移动),然后从头遍历链表n-k-1次得到新链表的尾节点,而其下一个节点就是新链表的头节点。此时我们将原链表的尾指针指向原链表的头节点,再将新链表的头节点记录下来最后置新链表的尾节点为空即可。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* rotateRight(ListNode* head, int k) {int count=0;ListNode* temp=head;ListNode* tail=nullptr;ListNode* newHead=nullptr;while(temp){if(temp->next==nullptr)tail=temp;count++;temp=temp->next;}if(count==0)return head;k=k%count;if(k==0)return head;k=count-k-1;temp=head;for(int i=0;i<k;i++){temp=temp->next;}newHead=temp->next;temp->next=nullptr;tail->next=head;return newHead;}
};

收获

82. 删除排序链表中的重复元素 II

82. 删除排序链表中的重复元素 II

题目介绍

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:
在这里插入图片描述

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:
在这里插入图片描述

输入:head = [1,1,1,2,3]
输出:[2,3]

思路

本题其实最关键的就是使用一个哑节点类似书上没有用处的头节点一样,这里称呼它为哑节点。一般用这种情况是因为第一个节点可能会被删掉。首先建立一个指向第一个节点的哑节点newHead,然后使用一个指针cur从newHead来遍历整个链表,在遍历的过程中要判断相邻的俩个节点是否相同(只需判断每一组相同数的子链表前俩个),若相同的话则记录此时节点的值,然后将链表中与这个值相同的节点全部删掉,直到出现相邻的节点值不同;若不同的话则可以将cur置于该节点上使用cur->next判断下一组子串。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {if(!head){return head;}ListNode* newHead=new ListNode(0,head);ListNode* cur=newHead;while(cur->next&&cur->next->next){if(cur->next->val==cur->next->next->val){int x=cur->next->val;while(cur->next&&cur->next->val==x){cur->next=cur->next->next;}}else{cur=cur->next;}}return newHead->next;}
};

收获

哑节点的使用很巧妙,极大程度上的能符合我的逻辑思维且减少我的代码复杂程度。

86. 分隔链表

86. 分隔链表

题目介绍

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

示例 1:

在这里插入图片描述

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

思路

这题也巧借哑节点的思路,因为头节点不确定是否仍能保持其头节点的地位(如果他大于x那么他就不再是头节点)。这道题我们使用俩个哑节点分别存储按链表顺序分别大于x和小于x的节点,最后再将这两个链表合并即得到所需链表。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* partition(ListNode* head, int x) {ListNode* small=new ListNode(0);ListNode* large=new ListNode(0);ListNode* smallHead=small;ListNode* largeHead=large;while(head){if(head->val<x){small->next=head;small=small->next;}else{large->next=head;large=large->next;}head=head->next;}small->next=largeHead->next;large->next=nullptr;return smallHead->next;}
};

收获

巩固了哑节点的使用,对于链表类的题,其中对于首节点的处理往往都用到了哑节点的方法。

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

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

相关文章

网络编程第二天

1.基于TCP的通信(面向连接的通信) 服务器代码实现&#xff1a; #include <myhead.h> #define IP "192.168.126.91" #define PORT 9999 int main(int argc, const char *argv[]) {//1、创建套接字int sfd-1;if((sfdsocket(AF_INET,SOCK_STREAM,0))-1){perror(…

设计模式——2_3 迭代器(Iterator)

生活就像一颗巧克力&#xff0c;你永远不知道下一颗是什么味道 ——《阿甘正传》 文章目录 定义图纸一个例子&#xff1a;假如你的采集器供应商提供了不同类型的返回值单独的遍历流程实现 碎碎念如果读写同时进行会发生啥&#xff1f;外部迭代和内部迭代迭代器和其他模式迭代器…

List 集合遍历过程中删除元素避坑指南。

文章目录 1. 遍历2. 遍历过程中删除元素2.1 for 简单循环正向遍历方式2.2 for 简单循环反向遍历方式2.3 foreach 方式遍历删除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推荐&#xff09;<green>2.6 Strem 方式 作为一名后端开发…

http状态,cookie、session、token的对比

http是无状态的&#xff0c;也就是说断开会话了服务器就不记得任何事情了&#xff0c;但这样对于用户会很麻烦&#xff0c;因为要不停输入用户名和密码 cookie是放在浏览器里的数据&#xff0c;第一次访问后服务器会set cookie&#xff0c;然后浏览器保存这个cookie&#xff0…

自动化测试实例—Web登录功能性测试(无验证码)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一…

总结一下linux性能检测和调优手段

1.perf 是 Linux 系统中性能分析工具&#xff0c;用于收集性能相关的信息。它可以用于查看 CPU 使用情况、内存性能、磁盘 I/O 等&#xff0c;以帮助开发者找到性能瓶颈。 以下是一些 perf 常见用法和示例&#xff1a; 1. CPU Profiling a. 查看 CPU 使用率 perf stat -e cpu…

大数据职业技术培训包含哪些

技能提升认证考试&#xff0c;旨在通过优化整合涵盖学历教育、职业资格、技术水平和高新技术培训等各种教育培训资源&#xff0c;通过大数据行业政府引导&#xff0c;推进教育培训的社会化&#xff0c;开辟教育培训新途径&#xff0c;围绕大数据技术人才创新能力建设&#xff0…

百度交出2023年业绩答卷:全力提速AI布局,注入业绩增长新动能

2月28日&#xff0c;百度集团&#xff08;HK:09888、NASDAQ:BIDU&#xff0c;下称“百度”&#xff09;发布2023年第四季度及全年财报&#xff0c;交出了一份营收与利润双双跃升的答卷&#xff0c;展现出百度在巩固原有业绩护城河的基础上&#xff0c;投入AI大模型后释放出的巨…

vue2后台管理系统demo,包含增删查改、模糊搜索、分页

因一直敲小程序&#xff0c;vue不熟练&#xff0c;自己练手项目&#xff0c;就包含增删查改以及模糊搜索分页 一、页面简单但功能齐全 二、数据是mock模拟 三、启动步骤 1、 json-server --watch data.json 启动mock数据 2、npm i 下载依赖 3、npm run serve 四、github地址…

虚拟机部署Sentry步骤,国内地址

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

【YOLO v5 v7 v8 小目标改进】BiFormer:从局部空间特征到高效的全局空间特征

BiFormer&#xff1a;从局部空间特征到高效的全局空间特征 提出背景BiFormer 结构 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 论文&#xff1a;https://arxiv.org/pdf/2303.08810.pdf 代码&#xff1a;https://github.com/rayleizhu/BiFormer 问题: 传统的卷…

就业班 2401--3.1 Linux Day9--文件查找和压缩

一、文件查找与打包压缩 grep: 文件内容过滤 [rootqfedu.com ~]# grep root /etc/passwd #从/etc/passwd文件中过滤root字段 grep ^root root$ root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin 查找命令 [rootqfedu.com ~]# which ls ali…