题解 | 数组中的最长连续子序列
数组中的最长连续子序列
https://www.nowcoder.com/practice/eac1c953170243338f941959146ac4bf
首先,题目只要求找出最长连续的子串,并没有要求是连续的子串。所以我们可以先对数组进行排序,在寻找最长连续的子串即可。
寻找最长连续子串我们可以采取双指针算法来解决:
1、我们定义i,j指针,如果j-i == 1,则说明连续,此时j就可以持续向后走,同时让j与j-1位置的元素也进行比较。
2、但是数组中可能有重复元素,如果不处理,就会导致最终长度变长,所以我们额外设置变量count = 1,如果j-j-1 == 1,则count++,如果j-j-1 ==0,则说明该位置是重复元素,count不变,j继续走。
3、当j走到某个位置后,与前面的数不在连续了,此时就开始更新结果。ret = max(ret,count).
4、细节:因为该数组有可能本身就是一个连续数组,此时j可能会一致走到结尾,此时循环结束,并没有更新结果,所以我们在循环外面也得更新一次结果。
class Solution { public: int MLS(vector<int>& arr) { sort(arr.begin(), arr.end()); int i = 0, j = 1; int count = 1, ret = 0; while(j < arr.size()) { if(arr[j] - arr[j-1] == 1) { count++; j++; } else if(arr[j] - arr[j-1] == 0) j++; else { i = j; j = i + 1; ret = count > ret ? count : ret; count = 1; } } ret = count > ret ? count : ret; return ret; } };