双指针算法-day14(分组循环)

news2025/3/28 8:56:40

1.最长奇偶子数组

题目

解析

  • 分组循环模板:

  •  简单来说:
    • 第一步:指针遍历找到满足条件的开头下标,并用 start = i 记录开头;
    • 第二步:指针不断右移寻找满足条件的最长子数组;
    • 第三步:更新答案;
  • 时间复杂度:O(n),空间复杂度:O(1);

代码

class Solution {
public:
    int longestAlternatingSubarray(vector<int>& nums, int threshold) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = nums.size();
        int ans = 0;

        int i = 0;
        while(i < n){
            if(nums[i] > threshold || nums[i] % 2){
                i ++;// 直接跳过
                continue;
            }

            int start = i ++;// 找到了满足条件的开头下标
            while(i < n && nums[i] <= threshold && nums[i] % 2 != nums[i - 1] % 2){
                i ++;// 寻找满足条件最长子数组
            }

            ans = max(ans,i - start);// (start,i - 1) 均满足条件
        }

        return ans;
    }
};

2.连续字符

题目

解析

  • 同理可得

代码

class Solution {
public:
    int maxPower(string s) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = s.size();
        int ans = 0;

        int i = 0;
        while(i < n){
            int start = i ++;
            while(i < n && s[i] == s[i - 1]){
                i ++;
            }

            ans = max(ans,i - start);
        }

        return ans;
    }
};

3.哪种连续子字符串更长

题目

解析

  • 同理可得

代码

class Solution {
    int count(string s,char k){
        int n = s.size();
        int ans = 0;
        
        int i = 0;
        while(i < n){
            if(s[i] != k){
                i ++;
                continue;
            }

            int start = i ++;
            while(i < n && s[i] == k){
                i ++;
            }

            ans = max(ans,i - start);
        }

        return ans;
    }

public:
    bool checkZeroOnes(string s) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        return count(s,'1') > count(s,'0');
    }
};

4.找出长度为 K 的特殊子字符串

题目

解析

  • 同理可得

代码

class Solution {
public:
    bool hasSpecialSubstring(string s, int k) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = s.size();

        int i = 0;
        while(i < n){
            int start = i ++;
            while(i < n && s[i] == s[i - 1]){
                i ++;
            }

            if(i - start == k) return true;
        }

        return false;
    }
};

5.删除字符使字符串变好

题目

解析

  • 同理可得

代码

class Solution {
public:
    string makeFancyString(string s) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = s.size();
        string ans;

        int i = 0;
        while(i < n){
            int start = i ++;
            while(i < n && s[i] == s[i - 1]){
                i ++;
            }

            if(i - start <= 2) ans += s.substr(start,i - start);
            else ans += s.substr(start,2);
        }

        return ans;
    }
};

6.最长连续递增序列

题目

解析

  • 同理可得

代码

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = nums.size();
        int ans = 1;

        int i = 0;
        while(i < n){
            int start = i ++;
            while(i < n && nums[i] > nums[i - 1]){
                i ++;
            }

            ans = max(ans,i - start);
        }

        return ans;
    }
};

7.最长湍流子数组

题目

解析

  • 题目要求:相邻数字单调性不断翻转;
  • 判断条件:(arr[i - 1] - arr[i]) * (arr[i] - arr[i + 1]) < 0;
  • 注意:i + 1 号元素也满足条件,所以 ans += i - start + 1 注意加 1;

代码

class Solution {
    typedef long long LL;
public:
    int maxTurbulenceSize(vector<int>& arr) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = arr.size();
        int ans = 1;

        int i = 0;
        while(i < n - 1){ // 判断要用到后面一个元素
            if(arr[i] == arr[i + 1]){
                i ++;
                continue;// 重复元素跳过
            }

            int start = i ++;
            while(i < n - 1 && (LL)(arr[i - 1] - arr[i]) * (arr[i] - arr[i + 1]) < 0){
                i ++;
            }

            ans = max(ans,i - start + 1);// i + 1 号元素也满足
        }

        return ans;
    }
};

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

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

相关文章

Linux基础开发工具--gdb的使用

目录 安装准备&#xff1a; 1. 背景 2. 开始使用 3. 做一个Linux第一个小程序&#xff0d;进度条 安装准备&#xff1a; 对于gdb的学习使用&#xff0c;为了方便大家学习&#xff0c;我建议大家先安装一个cgdb进行学习&#xff0c;这样方便观察操作与学习gdb。 用以下…

RabbitMQ的高级特性介绍(一)

消息确认机制 ⽣产者发送消息之后, 到达消费端之后, 可能会有以下情况: a. 消息处理成功 b. 消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第二种情况, 就会造成消息丢失。 那么如何确保消费端已经成功接收了, 并正确处理了呢? 为了保证消息从队列…

QML开发入门1--安装QT6.8和新建第一个QtQuickApplication

1.下载在线安装工具 qt-online-installer-windows-x64-4.8.1.exe 2.安装 注&#xff1a;可能官网qt安装很慢。需要使用国内镜像源。推荐阿里镜像 qt-online-installer-windows-x64-4.8.1.exe --mirror https://mirrors.aliyun.com/qt3.配置QT关键配置 3.1 无法编译 注&#…

如何让节卡机器人精准对点?

如何让节卡机器人精准对点&#xff1f; JAKA Zu 软件主界面主要由功能栏、开关栏、菜单栏构成。 菜单栏&#xff1a;控制柜管理&#xff0c;机器人管理与软件管理组成。主要功能为对控制柜关机、APP 设置、机器人本体设 置、控制柜设置、连接机器人和机器人显示等功能。 开关…

在 Spring Boot 中调用 AnythingLLM 的发消息接口

整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口&#xff1a;/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . Windows Installation ~ AnythingLLMhttps://docs.anythingllm.com/installation-desktop/windows http://localhost:3…

[GHCTF 2025]Popppppp[pop链构造] [php原生类的利用] [双md5加密绕过]

题目 <?php error_reporting(0);class CherryBlossom {public $fruit1;public $fruit2;public function __construct($a) {$this->fruit1 $a;}function __destruct() {echo $this->fruit1;}public function __toString() {$newFunc $this->fruit2;return $new…

Tr0ll2靶机详解

一、主机发现 arp-scan -l靶机ip&#xff1a;192.168.55.164 二、端口扫描、漏洞扫描、目录枚举、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.164发现21端口的ftp服务开启 以UDP协议进行扫描 使用参数-sU进行UDP扫描 nmap -sU --min-rate 10000 -p- 19…

制造业数字化转型,汽车装备制造企业数字化转型案例,智能制造数字化传统制造业数字化制造业数字化转型案例

《某制造业企业信息化整体解决方案》PPT展示了一个汽车装备企业的整体信息化解决方案&#xff0c;阐述了该企业的业务特点和现状&#xff0c;主要包括按订单生产、多级计划和产品跟踪等&#xff0c;分析了信息化建设的主要困难&#xff0c;如信息管理手工化、过程数据追溯困难、…

科技云报到:AI Agent打了个响指,商业齿轮加速转动

科技云报到原创。 3月16日&#xff0c;百度旗下文心大模型4.5和文心大模型X1正式发布。目前&#xff0c;两款模型已在文心一言官网上线&#xff0c;免费向用户开放。 同时&#xff0c;文心大模型4.5已上线百度智能云千帆大模型平台&#xff0c;企业用户和开发者登录即可调用AP…

【蓝桥杯python研究生组备赛】005 数学与简单DP

题目1 01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&a…

大白话读懂java对象创建的过程

1. java对象创建流程&#xff08;大白话版&#xff09; 咱们java对象被创建的过程大致如下&#xff0c;即&#xff1a; 在 JVM 中对象的创建&#xff0c;从⼀个 new 指令开始&#xff1a; 首先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引用检查这个符号引用代表…

AI图像理解技术的演进

在CLIP等现代多模态模型出现之前&#xff0c;早期的图生文技术主要依赖人工标注的ImageNet等数据集&#xff0c;但其技术路线与当前方法存在本质差异。 一、传统图生文技术的标注依赖 ImageNet的核心地位 在2012-2020年间&#xff0c;ImageNet的1,400万张人工标注图像&#xff…

电脑节电模式怎么退出 分享5种解决方法

在使用电脑的过程中&#xff0c;许多用户为了节省电力&#xff0c;通常会选择开启电脑的节能模式。然而&#xff0c;在需要更高性能或进行图形密集型任务时&#xff0c;节能模式可能会限制系统的性能表现。这时&#xff0c;了解如何正确地关闭或调整节能设置就显得尤为重要了。…

【Java】——程序逻辑控制(构建稳健代码的基石)

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 文章目录&#xff1a; 一.顺序结构二.分支结构1.if 语句1.1 语法格式11.2 语法格式21.3 语法格式3 …

卫星互联网智慧杆:开启智能城市新时代​

哇哦&#xff01;在当下这个数字化浪潮正以雷霆万钧之势席卷全球的超酷时代&#xff0c;智慧城市建设已然成为世界各国你追我赶、竞相发力的核心重点领域啦&#xff01;而咱们的卫星互联网智慧杆&#xff0c;作为一项完美融合了卫星通信与物联网顶尖技术的创新结晶&#xff0c;…

Qt-QChart实现折线图

一、介绍场景 动态查看数据变化&#xff0c;或者了解数据发展趋势&#xff0c;让数据可以形象直观展现出来&#xff0c;这里推荐使用折线图的方式展现&#xff0c;本文抛砖引玉&#xff0c;简单实现一个实例&#xff0c;效果图如下&#xff1a; 二、实现步骤 1、charts组件 …

取消Win10锁屏界面上显示的天气、市场和广告的操作

要取消Win10锁屏界面上显示的天气、市场和广告&#xff0c;您可以按照以下步骤操作&#xff1a; 方法一&#xff1a;更改锁屏界面设置 打开“设置”&#xff1a; 点击“开始”菜单&#xff0c;然后点击齿轮状的“设置”图标。 进入“个性化”&#xff1a; 在“设置”窗口中&a…

从TouchDriver Pro到Touchdriver G1,Weart触觉手套全系解析:XR交互的“真实触感”如何实现?

Weart旗下的Touchdriver Pro触觉手套和Touchdriver G1触觉手套&#xff0c;凭借其技术创新&#xff0c;为用户带来了全新的触觉体验。Touchdriver Pro触觉手套通过多模态触觉反馈技术&#xff0c;提供力反馈、纹理渲染和温度提示&#xff0c;让用户在虚拟环境中感受到真实的触觉…

排序算法实现:插入排序与希尔排序

目录 一、引言 二、代码整体结构 三、宏定义与头文件 四、插入排序函数&#xff08;Insertsort&#xff09; 函数作用 代码要点分析 五、希尔排序函数&#xff08;ShellSort&#xff09; 函数作用 代码要点分析 六、打印数组函数&#xff08;PrintSort&#x…

UDP协议原理

UDP协议原理 本篇介绍 在前面使用UDP编程时已经基本了解了UDP的工作模式&#xff0c;也知道了UDP有三个特点&#xff1a; 无连接不可靠面向数据报 但是当时并没有具体谈论为什么UDP有以上三个特点&#xff0c;基于这个原因&#xff0c;本篇就会针对这三个原因进行介绍 UDP…