力扣128最长连续序列
由于题目在哈希分类,所以向哈希方向思考。还有一点是题目中提到“时间复杂度O(n)”,其实如果没有这个条件直接可能会朝着数组处理方向,先排序(积累这种思考方式),去重,累积连续最长……,很麻烦。所以直接向哈希思考,但是如果使用数组来处理,题目中说明了num[i]的数量级达到了9次幂,所以数组长度显然不够。这种情况下我们就要向着底层O(logn),自动去重,自动排序的set方向思考。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
set<int> s;
int len=nums.size();
vector<int>result;//存放找到的结果
if(len==0)
return 0;
for(int i=0;i<len;++i)
s.insert(nums[i]);
set<int>::iterator iter=s.begin();
int temp=*iter;//存放第一个元素的值
iter++;
int sum=1;//最长连续序列
bool flag=false;
while(iter!=s.end())
{
if((*iter-temp)!=1)
{
result.push_back(sum);//存放一次连续序列长度
sum=1;
}
else
sum++;//连续序列加一
temp=*iter;//指向下一个位置
iter++;
}
result.push_back(sum);//把最后一次连续的存入
int len2=result.size();
int mmax=1;
for(int i=0;i<len2;++i)
mmax=max(result[i],mmax);
return mmax;
}
};
1.思路不难,但是想要一次通过很困难,其实是使用双指针,对于每一个元素,左指针temp变量如果比右指针iter指针小1,那么那么可以自动计算sum增加。如果不连续,那么重新sum=1,开始累积连续。
2.并不是nums只有一个连续序列,所以我使用vector最终选择一个最大的连续序列。
3.必须在遍历之后存入最后一次的sum,因为遍历如果最后到end(),是没有机会存放最后一次的连续序列的。
4.虽然题目很简单,但是不要浪费太多时间,最初就把可能的情况思考周全,以免后续反复修改。也要刻意积累常见的提高代码健壮性的思考方式。
力扣49字母异位次词分组
首先看到这道题目的时候被中等题目吓到,没有向着set,map方向思考。开始使用vector和二维vector手撕,代码不断调试不断修改大约50行,持续了1h。最终看到题解仅仅几行,暴露了对于map的不熟悉,其实在调试的过程中就可以看得到对于很多映射比较很乱,但是没有向 map思考,但是这道题的大前提思路还是排序。
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> media;//1.
for(string str:strs)//2.
{
string key=str;
sort(key.begin(),key.end());//3.
media[key].push_back(str);//4.
}
vector<vector<string>>ans;
for(auto it=media.begin();it!=media.end();++it)//5.
{
ans.push_back(it->second);//6.
}
return ans;
}
1.注意对于map的定义方式<,>分别放置键和值,类型自己考虑
2. 对于vector的遍历方式,刻意直接类似于py,for(type element:elements)
3.对于字符串也可以使用sort(string.begin(),string.end())进行排序
4.对于map直接赋值给对应的键的操作要仔细体会,这个是关键操作,如果不使用map那么需要大段代码实现。
5.熟悉对于unordered_map的遍历过程
6.对于键是:it->first,对于值是it->second