给你一个数组,O(N)时间找出某些个数,这些题如果没见过,还真不是很好想。做了这些题,我觉得有下面两个个比较常见的思路:
1. 用两个指针,可以从一边开始,走某个距离停止,也可能是一头一尾两个指针,定义一种大小关系,他俩比较之后移动,直到相遇。
2. 用其他的辅助的数据结构,可能是hash表,可能是map,可能是栈或者队列。这种通常用在访问了现在的不能确定他们是不是有用,是不是能影响最后的结果,如果不先存下来,复杂度很可能就是N^2的了。
思路抽象了些,第二刷的时候我想能不能具体归类一下。
这道题用到了第二种,用辅助的空间。数组没排序,也没告诉数据范围,什么双指针肯定搞不定了,连续的数字可能离很远,用自动排序好的map方便一些。map的值正好可以用来标记是否访问过。关于什么时候用什么样的辅助结构,应该也有比较系统的经验,我道行还不够深,不能很好的总结,先欠着。
实现的时候,从头开始扫map,如果没访问过,就从左和右两侧查看,有个问题,如果用下标方法访问map,那个键不存在的话,会自动插入一个,对这个问题是没有影响的,因为自动插入的int为0,而且扫的顺序是按照原来数组中的顺序,因此map的规模变化了也没关系,其他的问题要注意这个影响。
class Solution { public: int longestConsecutive(vector<int> &num) { int len = num.size(); if(len<=1) return len; int res = 1; map<int, int> seq; for(int i=0;i<len;i++){ seq[num[i]] = 1; } for(int i=0;i<len;i++){ if(!seq[num[i]]) continue; int tpres = 1; seq[num[i]] = 0; int left = num[i]-1; int right = num[i]+1; while(seq[left]){ seq[left--] = 0; tpres++; } while(seq[right]){ seq[right++] = 0; tpres++; } if(tpres>res) res = tpres; } return res; } };
leetcode第一刷_Longest Consecutive Sequence
时间: 2024-10-10 08:48:39