这个题用动态规划比较好解决一点。需要找到不变的是啥?这个是难点。
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; } };