目录
牛客_最长无重复子数组_滑动窗口
题目解析
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;
}
}