自学内容网 自学内容网

每日OJ题_牛客_最长无重复子数组_滑动窗口_C++_Java

目录

牛客_最长无重复子数组_滑动窗口

题目解析

C++代码1暴力

C++代码2滑动窗口

Java代码滑动窗口


牛客_最长无重复子数组_滑动窗口

最长无重复子数组_牛客题霸_牛客网 (nowcoder.com)

描述:

            给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。

子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组


题目解析

        经典滑动窗口,使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到map中,如果i扫描过的元素没有重复的就一直往后移,顺便记录一下最大值max,如果i扫描过的元素有重复的,就改变j的位置。也可使用暴力AC。

C++代码1暴力

#include <ostream>
#include <unordered_set>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
int res = 1, sz = arr.size();
for (int i = 0; i < sz; ++i)    // 暴力
{
int len = 1;
vector<bool> hash(100001, false);
hash[arr[i]] = true;
for (int j = i + 1; j < sz && hash[arr[j]] == false; ++j)
{
++len;
hash[arr[j]] = true;
}
res = max(res, len);
}   
// for (int i = 0; i < sz; )    // 笔试时写的,8/11
// {
// int len = 1;
// vector<bool> hash(100001, false);
// hash[arr[i++]] = true;
// while (i < sz && hash[arr[i]] == false)
// {
// ++len;
// hash[arr[i]] = true;
// ++i;
// }
// res = max(res, len);
// }
return res;
}
};

C++代码2滑动窗口

#include <ostream>
#include <unordered_set>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
int res = 1, sz = arr.size();
for (int i = 0; i < sz; ++i)    // 暴力
{
int len = 1;
vector<bool> hash(100001, false);
hash[arr[i]] = true;
for (int j = i + 1; j < sz && hash[arr[j]] == false; ++j)
{
++len;
hash[arr[j]] = true;
}
res = max(res, len);
}   
// for (int i = 0; i < sz; )    // 笔试时写的,8/11
// {
// int len = 1;
// vector<bool> hash(100001, false);
// hash[arr[i++]] = true;
// while (i < sz && hash[arr[i]] == false)
// {
// ++len;
// hash[arr[i]] = true;
// ++i;
// }
// res = max(res, len);
// }
return res;
}
};

Java代码滑动窗口

import java.util.*;
public class Solution
{
    public int maxLength (int[] arr) 
    {
        int[] hash = new int[100010];
        int left = 0, right = 0, n = arr.length;
        int ret = 0;
        while(right < n)
        {
            hash[arr[right]]++; // 进窗⼝
            while(hash[arr[right]] > 1) // 判断
            {
                // 出窗⼝
                hash[arr[left]]--;
                left++;
            }
            ret = Math.max(ret, right - left + 1); // 更新结果
            right++;
        }
        return ret;
    }
}

原文地址:https://blog.csdn.net/GRrtx/article/details/142729100

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!