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指向NULL
        while(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指向NULL
        do{
            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指向NULL
        while(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();//长度为4
        int slen = s.length();//长度为8
        string obj ;
        for(int i = 0;i<k;i++){
            //int cnt = 0;
            //获得每一个元素的长度len
            int 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;
    }
};*/

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

100+大屏模板,基于Vue 国产开源 IoT 物联网 Web 组态可视化 BI 数据分析工具

项目源码&#xff0c;文末联系小编 01 DataEase 可视化大屏 DataEase 是一个国产开源的数据可视化分析工具(BI工具)&#xff0c;旨在帮助用户快速分析数据并洞察业务趋势&#xff0c;以实现业务的改进与优化。它支持丰富的数据源连接&#xff0c;包括OLTP和OLAP数据库、数据仓库…

19.JWT

1►JWT博客推荐 阮老师讲得很好了&#xff0c;网址如下&#xff1a; http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 2►ry是怎么践行JWT的呢&#xff1f; 问题一&#xff1a;不登录的时候有token吗&#xff1f; 答&#xff1a;没有&#xff0c;所…

ARTS Week 36

unsetunsetAlgorithmunsetunset 本周的算法题为 1528. 重新排列字符串 给你一个字符串 s 和一个 长度相同 的整数数组 indices 。 请你重新排列字符串 s &#xff0c;其中第 i 个字符需要移动到 indices[i] 指示的位置。 返回重新排列后的字符串。 img 示例 1&#xff1a;输入&…

模板进阶:非类型模板参数,类模板特化,模板的编译分离

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常…

数据分析:基于聚类的LASSO预测模型包----clustlasso

介绍 clustlasso是结合lasso和cluster-lasso策略的R包&#xff0c;并发表在Interpreting k-mer based signatures for antibiotic resistance prediction。 标准交叉验证lasso分类或回归流程如下&#xff1a; 选择交叉验证数据集&#xff08;数据分割&#xff09;&#xff1…

llama2阅读: logits是什么?

Logits是一个在深度学习中&#xff0c;几乎一直都有的概念&#xff0c;它意味着模型unnormalized final scores. 然后你可以通过softmax得到模型针对你class的概率分布。 而在llama2的代码中&#xff0c;同样有logits的使用&#xff0c;那么针对llama2&#xff0c;logits的作用…

mysql signed unsigned zerofill详解

灵感来源 mysql中有符号signed&#xff0c;无符号unsigned与零填充zerofill UNSIGNED 无符号UNSIGNED是一个属性&#xff0c;你可以在创建或修改表时为整数类型的列指定它。无符号属性意味着该列只能存储非负整数&#xff08;0和正整数&#xff09;&#xff0c;而不是默认的有…

uniapp微信接口回调 response.sendRedirect nginx 报404错误

如题 参考 uniapp打包H5时,访问index.html页面白屏报错net::ERR_ABORTED 404 - 简书 nginx中修改 配置文件 location / { try_files $uri $uri/ /index.html; root html; index index.html index.htm; } uniapp里配置 重新载入

CentOS 6.5 配置国内在线yum源和制作openssh 9.8p1 rpm包 —— 筑梦之路

CentOS 6.5比较古老的版本了&#xff0c;而还是有一些古老的项目仍然在使用。 环境说明 1. 更换国内在线yum源 CentOS 6 在线可用yum源配置——筑梦之路_centos6可用yum源-CSDN博客 cat > CentOS-163.repo << EOF [base] nameCentOS-$releasever - Base - 163.com …

STM32-LED和蜂鸣器

本内容是基于江协科技STM32视频整理而得。 1. LED和蜂鸣器 1.1 LED和蜂鸣器简介 LED&#xff1a;发光二极管&#xff0c;正向导通点亮&#xff0c;反向通电不亮 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可持续发声&#xff0c;频率固定。 无…

【反悔堆 反悔贪心】2813. 子序列最大优雅度

本文涉及知识点 反悔堆 反悔贪心 LeetCode 2813. 子序列最大优雅度 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可…

哈弗架构和冯诺伊曼架构

文章目录 1. 计算机体系结构 2. 哈弗架构&#xff08;Harvard Architecture&#xff09; 3. 改进的哈弗架构 4. 冯诺伊曼架构&#xff08;Von Neumann Architecture&#xff09; 5. 结构对比 1. 计算机体系结构 计算机体系结构是指计算机系统的组织和实现方式&#xff0c…

Java.lang.Thread类和Java的主线程

一.Java.lang.Thread类 支持多线程编程 常用方法 二.主线程 ◆Java程序启动时&#xff0c;一个线程立即随之启动&#xff0c;通常称之为程序的主线程 ◆main()方法即为主线程入口 ◆产生其他子线程的线程 ◆必须最后完成执行&#xff0c;因为它执行各种关闭动作 示例 使用…

企业相册名片管理小程序模板

微信小程序个人名片公司信息,增添公司信息,增添企业信息,编辑个人信息,查看更多,名片通讯录。 企业相册名片管理小程序模板

BUUCTF - Basic

文章目录 1. Linux Labs 【SSH连接漏洞】2. BUU LFI COURSE【文件包含漏洞】3. BUU BRUTE【暴力破解用户名密码】4. BUU SQL COURSE【SQL注入-当前数据库】5. Upload-Labs-Linux 1【文件上传漏洞】7. Buu Upload Course 1【文件上传包含漏洞】8. sqli-labs 1【SQL注入-服务器上…

Python | Leetcode Python题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsNearbyAlmostDuplicate(self, nums, k, t):from sortedcontainers import SortedSetst SortedSet()left, right 0, 0res 0while right < len(nums):if right - left > k:st.remove(nums[left]…

【TORCH】绘制权重分布直方图,权重torch.fmod对torch.normal生成的随机数进行取模运算

要绘制上述代码中权重初始化的分布&#xff0c;可以分别展示每一层初始化权重的直方图。我们将用 torch.fmod 对 torch.normal 生成的随机数进行取模运算&#xff0c;确保权重值在 -2 到 2 之间。 含义解释 torch.normal(0, init_sd, size...)&#xff1a;生成服从均值为 0、…

vs2022安装qt vs tool

1 缘由 由于工作的需要&#xff0c;要在vs2022上安装qt插件进行开发。依次安装qt&#xff0c;vs2022&#xff0c;在vs2022的扩展管理中安装qt vs tool。 2 遇到困难 问题来了&#xff0c;在qt vs tool的设置qt version中出现问题&#xff0c;设置msvc_64-bit时出现提示“invali…

yolov8实战——yolov8TensorRT部署(python推理)(保姆教学)

yolov8实战——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09; 一 、准备好代码和环境安装TensorRt下载代码和安装环境 部署和推理构建ONNX构建engine无torch推理torch推理 最近用到yolov8&#xff0c;但是寻找了一圈才找到了yolov8最…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十一)-git(3)

Git是目前最流行的版本控制系统之一&#xff0c;在现代软件开发中扮演着重要的角色。它能够有效地跟踪文件变化、协作开发&#xff0c;并存储项目的历史记录。本文的目的是向读者介绍Git的基本概念和工作原理&#xff0c;帮助初学者快速上手使用Git&#xff0c;并帮助有经验的开…