leetcode 128. Longest Consecutive Sequence
解法一:
- 先进行排序,然后比较
但sort不一定让用
解法二:
- 遍历每一个数nums,定义两个值 pre,next; pre=nums--, next=nums++;找是否存在
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 由于不考虑重复的情况,所以用set
set<int> s(nums.begin(),nums.end());
int res=0;
for(int i=0;i<nums.size();i++)
{
int pre=nums[i]-1;
int next=nums[i]+1;
while(s.count(pre)!=0)pre--;
while(s.count(next)!=0) next++;
res=max(res, (next-pre-1));
// cout<<pre<<" "<<next<<endl;
}
return res;
}
};
但是这个解法里根本没有考虑已经被考虑的元素:
假设为【1,2,3,4】
从1 开始 1 得到0-5;
接着考虑2: 2 也是0-5
所以被考虑过的元素要删除。。。。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> s(nums.begin(),nums.end());
int res=0;
for(int i=0;i<nums.size();i++)
{
if(s.find(nums[i])==s.end())
continue;
//删除考虑过的元素
s.erase(nums[i]);
int pre=nums[i]-1;
int next=nums[i]+1;
while(s.count(pre)!=0) s.erase(pre--);
while(s.count(next)!=0) s.erase(next++);
res=max(res, (next-pre-1));
// cout<<pre<<" "<<next<<endl;
}
return res;
}
};
set 为有序且不重复:
set: nums=[1,2,3,4,3]
set(num.begin(), nums.end())
得到的set为: [1,2,3,4];
nums=[3,2,1,3,4]
得到的set为:[1,2,3,4]
unordered_set
没有顺序
python 解法:
class Solution(object):
def longestConsecutive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
maxlen=0;
numset=set(nums)
for n in set(nums):
if(n not in numset):
continue
prenum=n-1;
nextnum=n+1;
while(prenum in numset):
numset.discard(prenum)
prenum-=1
while(nextnum in numset):
numset.discard(nextnum)
nextnum+=1
maxlen=max(maxlen, nextnum-prenum-1)
return maxlen
python 中的set操作:
python 中的main 函数:
if __name__=="__main__": 类似java与c中的main主函数。。。
if __name__=="__main__":
nums=[100, 4, 200,1,3,2]
s=Solution()
c=s.longestConsecutive(nums)
print(c)

浙公网安备 33010602011771号