最短无序连续子数组+双指针

题目:

思考:

  1. 我们要找到最短连续 子数组使得这个数组有序后整个nums有序
  2. 那么意味着 除了这个要找的数组以外的nums其余部分都已经有序
  3. 要使得这个数组长度最小,就要让这个数组前和数组后的原来的 有序部分最长
  4. 将nums分为三部分(nums1,nusm2,nums3)
  5. 可以知道nums1中最大的值要比nums2最小的值小(同理nums3最小的值要比nums2最大的值大)
  6. 利用这个性质得出nusm2的左右边界
  7. 从前往后遍历:维持一个最大值max_,遇到遍历值小于max_的时候说明这个值之前存在无序部分(也就是说这个值的位置pos是nums2的潜在右边界(为什么是潜在?因为要找最右边的无序位置)这样找到最右边的无序位置和最左的无序位置作为左右边界才能使得这个数组有序后整个nums有序)
  8. 从后往前遍历:同理不赘述

实现:

cpp 复制代码
class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {

        int l=-1;
        int r=-1;

        int max_=INT_MIN;
        int min_=INT_MAX;


        
        for (int i=0;i<nums.size();i++)
        {
            if (nums[i]<max_)
            {
                l=i;
            }
            else
            {
                max_=nums[i];
            }
        }

        for (int i=nums.size()-1;i>=0;--i)
        {
            if (nums[i]>min_)
            {
                r=i;
            }
            else
            {
                min_=nums[i];
            }
        }


        return (l!=-1)?l-r+1:0;
    }
};

合并遍历搜索:

cpp 复制代码
class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {

        int l=-1;
        int r=-1;

        int max_=INT_MIN;
        int min_=INT_MAX;


        
        for (int i=0;i<nums.size();i++)
        {
            if (nums[i]<max_)
            {
                l=i;
            }
            else
            {
                max_=nums[i];
            }

            if (nums[nums.size()-i-1]>min_)
            {
                r=nums.size()-i-1;
            }
            else
            {
                min_=nums[nums.size()-i-1];
            }

        }

        return (l!=-1)?l-r+1:0;
    }
};
相关推荐
燃于AC之乐2 天前
《算法实战笔记》第10期:六大算法实战——枚举、贪心、并查集、Kruskal、双指针、区间DP
算法·贪心算法·图论·双指针·区间dp·二进制枚举
睡不醒的kun4 天前
不定长滑动窗口-求子数组个数
数据结构·c++·算法·leetcode·职场和发展·双指针·滑动窗口
伟大的车尔尼5 天前
双指针题目:复写零
双指针
拾光Ծ6 天前
【优选算法】双指针算法:专题二
c++·算法·双指针·双指针算法·c++算法·笔试面试
艾莉丝努力练剑8 天前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
老鼠只爱大米10 天前
LeetCode经典算法面试题 #24:两两交换链表中的节点(迭代法、递归法等多种实现方案详细解析)
算法·leetcode·链表·递归·双指针·迭代·链表交换
沉默-_-11 天前
力扣hot100双指针专题解析2(C++)
java·c++·算法·蓝桥杯·双指针
老鼠只爱大米11 天前
LeetCode经典算法面试题 #19:删除链表的倒数第N个结点(双指针、栈辅助法等多种实现方案详细解析)
算法·leetcode·链表·双指针·删除链表节点·一趟扫描
2401_8414956412 天前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针
老鼠只爱大米13 天前
LeetCode经典算法面试题 #160:相交链表(双指针法、长度差法等多种方法详细解析)
算法·leetcode·链表·双指针·相交链表·长度差法