leetcode力扣_双指针问题

141. 环形链表

思路:判断链表中是否有环是经典的算法问题之一。常见的解决方案有多种,其中最经典、有效的一种方法是使用 快慢指针(Floyd’s Cycle-Finding Algorithm)

  • 初始化两个指针:一个快指针(fast)指向头节点的下一个节点(head->next),一个慢指针(slow)指向头节点(head)。
  • 移动指针
    • 慢指针每次移动一步。
    • 快指针每次移动两步。
  • 判断环的存在
    • 如果链表中存在环,那么快指针和慢指针最终会在环中相遇。
    • 如果链表没有环,快指针会遇到 NULL(链表的末尾)。

解答如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:bool hasCycle(ListNode *head) {//如果头指针为空或者下一个为空即链表只有一个元素//那么这个链表就不是循环的if(head == nullptr  || head->next == nullptr ){return false ;}ListNode* slow = head;ListNode* fast = head->next;//循环停止的条件是slow和fast指向同一个元素//或者 fast或fast->next指向NULLwhile(slow != fast){if(fast == nullptr  || fast->next == nullptr ){return false ;}slow = slow->next ;fast = fast->next->next ;}return true ;}
};

循环条件也可以改为其他的形式,或者使用do-while循环,使用do-while循环,则需要对fast和slow的初值进行更改:

//使用do-while循环
class Solution {
public:bool hasCycle(ListNode *head) {//如果头指针为空或者下一个为空即链表只有一个元素//那么这个链表就不是循环的if(head == nullptr  || head->next == nullptr ){return false ;}ListNode* slow = head;ListNode* fast = head;//循环停止的条件是slow和fast指向同一个元素//或者 fast或fast->next指向NULLdo{if(fast == nullptr || fast->next == nullptr){return false ;}slow = slow->next ;fast = fast->next->next ;}while(slow != fast);return true ;}
};

另外也可以将fast != nullptr && fast->next != nullptr放在外层:

class Solution {
public:bool hasCycle(ListNode *head) {//如果头指针为空或者下一个为空即链表只有一个元素//那么这个链表就不是循环的if(head == nullptr  || head->next == nullptr ){return false ;}ListNode* slow = head;ListNode* fast = head;//循环停止的条件是slow和fast指向同一个元素//或者 fast或fast->next指向NULLwhile(fast != nullptr && fast->next != nullptr){//在循环中应首先移动指针,然后再检查 slow 和 fast 是否相等slow = slow->next ;fast = fast->next->next ;if(slow == fast){return true ;}}return false ;}
};

524. 通过删除字母匹配到字典里最长单词

题目描述:给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。

思路:开始自己想起来有点乱糟糟的,看了一下官方给的思路,然后理了一下。

在写的过程中,while块中的语句些的稍微复杂了一点,看了别人的代码后改了一下,原来是这样写的:完全按照想的逻辑,没有思考简化

while(m<slen){//只要还没将s搜索完就要继续搜索if(s[m] == dictionary[i][d]){d++;m++;} else{m++;}
}

然后就是if块中的代码,写得乱糟糟的也,看了一下别人的代码,茅塞顿开,我写的时候在想,怎么才能顺利的存进去第一个满足要求的字符串,因为最开始没有目标字符串,怎么比较长度呢,后来知道使用默认构造函数 string ans; 定义一个 std::string 对象时,它会被初始化为一个空字符串,长度为0,所以可以这样直接比较。

基础薄弱脑袋空空

正确代码如下:

class Solution {
public:string findLongestWord(string s, vector<string>& dictionary) {int k = dictionary.size();//长度为4int slen = s.length();//长度为8string obj ;for(int i = 0;i<k;i++){//int cnt = 0;//获得每一个元素的长度lenint len = dictionary[i].size();//例如第一个元素为ale,长度就为3//下面判断该元素是不是字符串s的子元素int m=0,d=0;while(m<slen){//只要还没将s搜索完就要继续搜索if(s[m] == dictionary[i][d]){d++;} m++;}//cnt==len说明该字符串在字典中存在if(d == len ){if(len > obj.length()){obj = dictionary[i];//有点奇怪,为什么要加一个dictionary[i] < obj这个条件//原题目中字母序最小的字母序最小的字符串是这个意思嘛//比较相同长度的字符串的大小,输出小的作为最后的结果} else if((len == obj.length()) && dictionary[i] < obj){obj = dictionary[i] ;} else{obj = obj ;}}}return obj;}
};//csdn上的答案
/*class Solution {
public:string findLongestWord(string s, vector<string>& dictionary) {//处理string ans;int n = s.size();//字符串的长度//auto& str : dictionary 是 C++11 引入的范围基 for 循环的一部分//用于遍历容器 dictionary 中的每个元素,并使用 str 作为对每个元素的引用。for (auto& str : dictionary){int m = str.size();//dictionary中元素的长度int i = 0, j = 0;while (i < m && j < n){if (str[i] == s[j]) i++;j++;}//处理if (i == m){if (str.size() > ans.size()){ans = str;}else if (str.size() == ans.size() && str < ans){ans = str;}}}return ans;}
};*/

双指针问题告一小段落,前面还有几题写了但是没有记录,懒得再整理了力扣上留有痕迹

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

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

相关文章

uni-app 使用Pinia进行全局状态管理并持久化数据

1.引言 最近在学习移动端的开发&#xff0c;使用uni-app前端应用框架&#xff0c;通过学习B站的视频以及找了一个开发模板&#xff0c;终于是有了一些心得体会。 B站视频1&#xff1a;Day1-01-uni-app小兔鲜儿导学视频_哔哩哔哩_bilibili B站视频2&#xff1a;01-课程和uni的…

JavaScript——for in类型

目录 任务描述 相关知识 for in型 编程要求 任务描述 苹果apple有多个属性表示它的产地&#xff0c;比如locationProvince表示省份&#xff0c;这些属性都以location开头&#xff0c;和产地无关的属性都不以location开头。 本关任务&#xff1a;完成一个计算苹果产地的函数…

[FFmpeg] windows下安装带gpu加速的ffmpeg

1.显卡能力排查 目前只有 NIVIDIA 支持 ffmpeg 的 gpu加速(AMD貌似也陆续开始支持)。 在下述网站中查找自己的显卡能够支持的编解码格式。https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-newhttps://developer.nvidia.com/video-encode-and-decod…

Vue88-Vuex中的mapActions、mapMutations

一、mapMutations的调用 此时结果不对&#xff0c;因为&#xff1a;若是点击事件不传值&#xff0c;默认传的是event&#xff01;&#xff0c;所以&#xff0c;修改如下&#xff1a; 解决方式1&#xff1a; 解决方式2&#xff1a; 不推荐&#xff0c;写法麻烦&#xff01; 1-…

【Unity数据交互】二进制私

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

Bootstrap 5 小工具

Bootstrap 5 小工具 Bootstrap 5 是一个流行的前端框架,它提供了一系列的工具和组件,帮助开发者快速构建响应式和移动优先的网页。在本文中,我们将探讨 Bootstrap 5 中的一些实用小工具,这些工具可以极大地提高开发效率和用户体验。 1. 网格系统 Bootstrap 5 的网格系统…

Laravel 宏指令(Macro)动态添加自定义方法到Laravel的核心组件中

Laravel 宏指令&#xff08;Macro&#xff09; 在Laravel中&#xff0c;宏指令&#xff08;Macro&#xff09;是一种灵活的方式&#xff0c;允许您动态添加自定义方法到Laravel的核心组件中&#xff0c;如模型、查询构建器、集合等&#xff0c;以便在不改变核心代码的情况下扩展…

电脑硬盘分区的基本步骤(2个实用的硬盘分区方法)

在现代计算机中&#xff0c;硬盘分区是非常重要的一步。无论是新硬盘的初始化&#xff0c;还是重新组织现有硬盘&#xff0c;分区都是必不可少的操作。本文将详细介绍电脑硬盘分区的基本步骤&#xff0c;帮助您更好地管理和利用硬盘空间。 文章开始&#xff0c;我们先简单说一…

【C++】 解决 C++ 语言报错:Invalid Conversion from ‘const char*’ to ‘char*’

文章目录 引言 在 C 编程中&#xff0c;类型转换错误&#xff08;Invalid Conversion&#xff09;是常见的编译错误之一。特别是当程序试图将一个常量字符指针&#xff08;const char*&#xff09;转换为非常量字符指针&#xff08;char*&#xff09;时&#xff0c;会导致编译…

Vmware环境下ESXi主机 配置上行链路、虚拟交换机、端口组、VMkernel网卡

一、适用场景 1、使用专业服务器跑多种不同的业务&#xff0c;每种业务可能所需运行的server环境不同&#xff0c;有的需要Linux server CentOS7/8、kali、unbuntu……有的需要windows server2008、2003、2016、2019、2022…… 2、本例采用的是VMware ESXi6.7 update 3版本&am…

力扣习题--找不同

目录 前言 题目和解析 1、找不同 2、 思路和解析 总结 前言 本系列的所有习题均来自于力扣网站LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 题目和解析 1、找不同 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t…

Java Maven中自动代码检查插件详细介绍

文章目录 Checkstyle主要特点使用场景配置与使用checkstyle.xmlsuppressions.xml 验证打包时验证执行命令验证 Spotless配置文件内容Java配置部分POM 配置部分Markdown 配置部分Up to Date Checking执行部分 验证打包时验证在插件中执行命令验证 Checkstyle Spotless 结合chec…

ABAP中BAPI_CURRENCY_CONV_TO_INTERNAL 函数的使用方法

在ABAP中&#xff0c;BAPI_CURRENCY_CONV_TO_INTERNAL 函数模块主要用于将外部金额转换为内部存储格式。这对于确保金额数据在SAP系统中的一致性和准确性至关重要。以下是关于该函数模块使用方法的详细解释&#xff1a; 函数模块参数 调用 BAPI_CURRENCY_CONV_TO_INTERNAL 时…

redis学习(005 java客户端 RedisTemplate学习)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第16p-第p23的内容 文章目录 java客户端jedisSpringDataRedis项目实现hash哈希操作 java客户端 jedis 测试 ps:如果连接不上&…

vs2019 无法打开项目文件

vs2019 无法打开项目文件&#xff0c;无法找到 .NET SDK。请检查确保已安装此项且 global.json 中指定的版本(如有)与所安装的版本相匹配 原因&#xff1a;缺少组件 解决方案&#xff1a;选择需要的组件进行安装完成

C#静态类与非静态类

1、静态类 静态类有几个重要的特点&#xff1a; 1&#xff09;无法实例化&#xff1a;由于静态类不能被实例化&#xff0c;因此它不会占用对象内存。 2&#xff09;静态成员&#xff1a;静态类只能包含静态成员&#xff08;静态方法、静态属性、静态事件等&#xff09;。 3&am…

步进电机改伺服电机

步进电机&#xff1a; 42&#xff1a;轴径5mm 57&#xff1a;轴径8mm 86&#xff1a;轴径14mm 【86CME120闭环】// 12牛米 伺服电机&#xff1a; 40&#xff1a; 60&#xff1a; 80&#xff1a; 86&#xff1a; ECMA——C 1 0910 R S 4.25A 轴径…

评价ChatGPT与强人工智能的未来

在人工智能领域&#xff0c;ChatGPT的出现无疑是一个里程碑事件。它不仅展示了自然语言处理技术的巨大进步&#xff0c;也引发了人们对于强人工智能&#xff08;AGI&#xff09;的无限遐想。本文将从多个角度评价ChatGPT&#xff0c;并探讨强人工智能距离我们还有多远。 ChatGP…

虚拟地址和物理地址

到底什么是虚拟地址呢&#xff1f;它和物理地址的区别又在哪呢&#xff1f; 一. 虚拟地址的作用 1. 使代码的移植性更好&#xff0c;在不同平台进行编译以后&#xff0c;就可以直接运行&#xff0c;因为到别的系统&#xff0c;会将你的虚拟地址转换为物理地址&#xff0c;而使…

无人机运营合格证及无人机驾驶员合格证(AOPA)技术详解

无人机运营合格证及无人机驾驶员合格证&#xff08;AOPA&#xff09;技术详解如下&#xff1a; 一、无人机运营合格证 无人机运营合格证是无人机运营企业或个人必须获得的证书&#xff0c;以确保无人机在运营过程中符合相关法规和标准。对于无人机运营合格证的具体要求和申请…