当前位置: 首页 > news >正文

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

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.dtcms.com/a/79489.html

相关文章:

  • java数据结构之双端对列
  • 力扣刷题——25.K个一组翻转链表
  • 【全国产化主板】解决方案探讨:CPU、FPGA、GPU、AI的融合与优化
  • 【最后203篇系列】020 rocksdb agent
  • 《视觉SLAM十四讲》ch13 设计SLAM系统 相机轨迹实现
  • Neo4j GDS-04-图的中心性分析介绍
  • 力扣977. 有序数组的平方(双指针技巧)
  • 【STM32】I²CC通信外设硬件I²CC读写MPU6050(学习笔记)
  • kubernetes高级实战
  • 6.3考研408数据结构中BFS与DFS的易错点及难点解析
  • 9、Python collections模块高效数据结构
  • 前端面试常考基础题目详解
  • 3月20号
  • 通过调整相邻分区实现Linux根分区扩容(ext4文件系统)
  • vue里localStorage可以直接用吗
  • Spring Boot 集成 Kafka 消息发送方案
  • idea配置gitee
  • QT 实现信号源实时采集功能支持频谱图,瀑布图显示
  • 【Linux进程】——进程的程序地址空间
  • B树与B+树在MySQL中的应用:索引
  • 华为OD机试-租车骑绿道-双指针(Java 2023 B卷 100分)
  • 【二分查找 并集查找】P6004 [USACO20JAN] Wormhole Sort S|普及+
  • vector和list的区别是什么
  • Golang 老题,生产者和消费者模型,先后关闭通道的问题
  • k8s主要控制器简述(二)DaemonSet|Job|CronJob
  • 蓝桥杯备考----》暴力枚举---金盏花
  • springboot实现文件上传到服务器上,并通过url访问
  • Spring Boot + Spring Integration整合MQTT打造双向通信客户端
  • flowable适配达梦7 (2.1)
  • 【C++】:使用ACL给你的文件夹加锁