每日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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值