这个题用动态规划比较好解决一点。需要找到不变的是啥?这个是难点。
1. 如果前一个位置结尾的最长无重复子数组长度是n,那当前最长n+1
2. 如果当前位置的数值之前存在过,当前位置结尾的最长的无重复子数组的长度需增加一个约束,当前位置减去上一个存在位置的长度。
3. 返回值是每次取max
4. 记录每个数值的前一个出现的位置,用hashmap最快
5.处理边界条件,默认每个数值的初始位置为-1,数组长度为0时,返回0,其余情况dp[0] 默认为1
class Solution {
public:
/**
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
if(arr.size() == 0){
return 0;
}
vector<int> dp = {1};
int n = arr.size();
int res = dp[0];
// write code here
unordered_map<int, int> m;
for(int i=0;i<10;i++){
m[i] = -1;
}
m[arr[0]] = 0;
for(int i=1;i<n;i++){
int num = arr[i];
dp.push_back(1);
if(m[num] != -1){
dp[i] = min(i-m[num],dp[i-1] + 1);
}else{
dp[i] = dp[i-1] + 1;
}
res = max(res,dp[i]);
// printf("dp[%d] = %d\n",i,dp[i]);
m[num] = i;
}
return res;
}
};



京公网安备 11010502036488号