当前位置: 首页 > 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;
    }
};

相关文章:

  • 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中的应用:索引
  • 商场网站建设公司/今天刚刚发生的新闻最新新闻
  • 海南省建设网站的公司电话号码/广告素材
  • 网站搜索排优化怎么做/用广州seo推广获精准访问量
  • 常州做网站哪家好/图片外链上传网站
  • 静态网站开发工具/制作网站要多少费用
  • 成人学历提升/seo信息优化