最开始没有使用哈希表,而是直接使用一个变量存储目前子数组的头部位置来记录信息,但是这种做法虽然五个测试用例都能通过,切在提交后也能通过8个用例,但唯独第九个用例无法通过,原因目前仍未确定,尝试修改一些细节,但都无解,希望看出来的大佬可以告知我。有问题的初版代码如下:
class Solution { public: /** * * @param arr int整型vector the array * @return int整型 */ int maxLength(vector<int>& arr) { // write code here int max = 0; int length = 0; int head = 0; //int rear = 0; for(int i = 0;i < arr.size();i++){ bool ct = false; if(head == i){ length = 1; continue; } for(int j = head;j < i;j++){ if(arr.at(j) == arr.at(i)){ head = i; if(length > max){ max = length; } length = 1; ct = true; continue; } } if(ct){ continue; } length++; } if(length > max){ max = length; } return max; } };
在对上述代码进行多次修改均无法通过第九个用例后,我参考了评论区大佬的代码,写出了下面这版能提交通过的代码。但我认为,我上面那版的代码的思路跟这版并无二致,只是上面那版在移动头指针时是直接使head=i,而下面这版是逐次移动的。观察第九个用例的输入发现其数据量极大,调试起来也很不方便,实在是无法发现原因。
class Solution { public: /** * * @param arr int整型vector the array * @return int整型 */ int maxLength(vector<int>& arr) { unordered_map<int, int> heap; int res = 0; for (int i = 0, j = 0; i < arr.size(); ++i) { heap[arr[i]]++; //while (heap[arr[i]] > 1) heap[arr[j++]]--; while(heap[arr[i]] > 1){ heap[arr[j]]--; j++; } res = max(res, i - j + 1); } return res; } };