最长无重复子数组写题记录

文章提供了两个C++类解决方案,分别使用了不同的方法来找出整型数组中的最长连续序列。第一个方案利用了数组和计数,第二个方案利用了unordered_map。当在第九组测试用例中出错后,给出了一个正确答案,该答案使用滑动窗口和哈希表来跟踪最长无重复字符的子字符串长度。
摘要由CSDN通过智能技术生成

class Solution {
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        // write code here
          int result = 0;
        int i = 0;
        int size = 6;
        size = arr.size();
        int arr1[9999999]{0};
        int temp = 0;
        int ta = -1;
        for(auto a : arr){
            if(arr1[a] == 0){
                arr1[a] += 1;//出现了加一
                
                result++;//如果时没出现过的数result加一
                if(temp<result)//为了保证最大连续次数不被覆盖
                temp = result;
                
            }
            else if(arr1[a]++ >= 1){
                if(result>1510){
                cout << a<<"= "<<ta<<endl;
                cout << "1 "<<arr1[a]<<endl;}
                if(arr1[a]>2){//在计数时有相同数字间断出现3次或以上的直接把result和出现次数都置一
                    arr1[a] = 1;
                    result = 1;
                }
               
                
                if(a == ta)//如果连续出现两次同样的数字result置一
                {
                    arr1[a] = 1;
                    result = 1;
                }
                else//没有连续出现两次,result不作变动等于把第一个重复去掉
                result+=0;
            }
            ta = a;
            
        }
        if(temp>result)
            return temp;
        else
            return result;
    }
};

2


class Solution {
  public:
    /**
     *
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        // write code here
        if(arr.size()==1){
            return 1;
        }
        unordered_map<int, int> arr1;
        int pre = arr[1];
        int tail = arr[0];
        int big=1;
        int small=0;
        int result=0;
        for(int i = 1; i < arr.size() ; i++){
            big = i;
            pre = arr[big];
            while(pre == tail&&small<big){
                tail = arr[++small];
            }
            if(arr1[arr[i]]==0)//一次没出现过的数记录一下
                arr1[arr[i]]=1;
            else{//发现了出现过的数,找到它
                arr1[arr[i]]=0;
                while(arr[i] != tail&&small<big){
                tail = arr[++small];
            }
            }
             while(pre == tail&&small<big){
                tail = arr[++small];
            }
            
            int temp = big - small + 1;
            if(temp>result){
                result = temp;
            }
            cout<<"1- "<<big<<" 2- "<<small<<endl;
        }
        
        return result;
    }
        
};

我写的这两个都在第九组错了,不清楚为什么。记一下

这个才是对的

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
                // write code here
   unordered_map<int, int> mp;
        int res = 0;
        //设置窗口左右边界
        for(int left = 0, right = 0; right < s.size(); right++){
            //窗口右移进入哈希表统计出现次数
            mp[s[right]]++;
            //出现次数大于1,则窗口内有重复
            while(mp[s[right]] > 1)
                //窗口左移,同时减去该数字的出现次数
                mp[s[left++]]--;//左移到与s[right]相同的字符时s[right]会减一来跳出while
            //维护子数组长度最大值
            res = max(res, right - left + 1);
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值