(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)
题目描述:
给定一个数组arr,返回arr最长的无重复子串的长度(无重复指的是所有数字都不相同)。(arr的长度为n,1≤n≤10^5)
例(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)
输入:[2,2,3,4,3]
输出:3
(这是牛客网提供的一道题目,想尝试的码友们,可以通过这个链接挑战https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4?tpId=117&tqId=37816&tab=answerKey)
分析
初看👓这道题,我以为是动态规划,然后,就5分钟一通规划,最后… …超时😰
后来,断断续续纠结了10天,最终用双指针通过了此题!
双指针
双指针就是一前一后两个指针(指针i 和 指针j),两个指针指向一个数组(数组arr),且使两个指针中间的那段数组中元素无重复。
解题思想:
接下来,我们就运用双指针来解决这个题目~
●初始--指针i 和指针j,数组arr。
i =0,指向arr的第1个元素;j=0,指向arr的第2个元素;
(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)
●如果指针i 和指针j中间的那段数组中元素无重复,就让指针j后移一位;
●如果指针i 和指针j中间的那段数组中元素有重复,就让指针i后移至无重复,然后让指针j后移一位;
●在这个过程中,指针i 和指针j中间含有的最多元素个数,就是所求值。
补充:用map判断是否有重复元素
(解这道题目的时候,又重新复习了一遍map,好久不用,基本忘记了)
○定义: map是一个关联容器,它提供一对一的hash。
第一个数,称为关键字(key),每个关键字只能在map中出现一次;
第二个数,称为该关键字的值(value);
○三个用到的函数
count() 返回指定元素出现的次数(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)
erase() 删除一个元素
size() 返回map中元素的个数
C++代码
class Solution {
public:
/**
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
int i, j, num;
num = 0;/*记录无重复最长子串的长度*/
if(arr.size() > 0)
{
map<int, int> bmap;/*用map判断是否有重复元素*/
i = 0;
bmap[arr[i]] = i;/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/
num = bmap.size();
if(arr.size() > 1)
{
j = 1;
while((i <= j)&&(j < arr.size()))
{
if(bmap.count(arr[j]))
{
while(arr[i] != arr[j])
{
bmap.erase(arr[i]);
i++;
}
i++;
}
bmap[arr[j]] = j;
if(bmap.size() > num)/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/
{
num = bmap.size();
}
j++;
}
}
}
return num;
}
};
每次无论是种植花,还是剪插鲜花,都会给生活带来很多希望和欣喜~--2021年4月23日