LeetCode 热题 100(持续更新版)
目录
一、哈希
(一)两数之和
(二)字母异位词分组
(三)最长连续序列
一、哈希
(一)两数之和
2025.10.9
1. 两数之和 - 力扣(LeetCode)
这个题应该没有写题解的必要了,只是自己好久没用力扣的环境了,还有点不习惯,哈哈
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ans;int i, j, k;int n = nums.size();for(i = 0; i < n; i ++){for(j = i+1; j < n; j ++){if(nums[i] + nums[j] == target){ans.push_back(i);ans.push_back(j);return ans;}}}return {};}
};
(二)字母异位词分组
2025.10.10
49. 字母异位词分组 - 力扣(LeetCode)
讲这道题之前,推荐大家一点要学会map,这简直是我最喜欢的数据结构,谁懂!!
推荐看看:map讲解
可以发现,同一组的字母异位词他们排序后的字符串是一样,例如,["ate","eat","tea"]所有字符串sort之后都是aet,说明他们是属于aet这一组的,这里使用map,把排序后相同的字符串设为一类,再把所有类合在一起,就是答案了,具体见代码
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {map<string, vector<string>> mp;string data;for(auto str: strs){data = str;sort(str.begin(), str.end());mp[str].push_back(data);}vector<vector<string>> res;for(auto m: mp){res.push_back(m.second);}return res;}
};
(三)最长连续序列
2025.10.11
128. 最长连续序列 - 力扣(LeetCode)
这道题还蛮有意思,求解方法有很多,但是限定了时间复杂度为O(n)
1、下面这个方案是我两年前写的,这个代码并不好,使用了sort,时间复杂度为O(n log n),并不符合题意,但是也过了,算是运气好吧。创建了一个tag数组,用来记录以第i个值为结尾对应的长度,具体题解在代码中,可以看看,思路还是比较清晰的。
class Solution {
public:int longestConsecutive(vector<int>& nums) {int i, j;int n = nums.size();if(n == 0) return 0;sort(nums.begin(), nums.end()); //sort排序已经不符合题意了vector<int> tag(n);tag[0] = 1; // tag数组是用来记录以第i个值为结尾对应的长度,第0个长度为1for(i = 1; i < n; i ++){if(nums[i] == nums[i-1] + 1){tag[i] = tag[i-1] + 1; // 说明是连续的,长度+1}else if(nums[i] == nums[i-1]){tag[i] = tag[i-1]; // 相同数值,对应的长度是不变的}else{tag[i] = 1; // 说明前面没有联系数值,只能以自身开头连续,值为1}}int max_size = 0;// 找出最长的for(auto t: tag){max_size = max(max_size, t);}return max_size;}
};
2、这是最新写的,其实思路和上面差不多,使用set,就不用sort排序了,同时还帮我们去重了,同时,不需要创建一个新的数组帮我们记录长度,直接边遍历边更新最大长度,具体见代码
class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.size() == 0) return 0;// 使用set,可以帮我们排序,顺便还去重了,非常好用!!set<int> new_nums; for(auto num: nums){new_nums.insert(num);}// max_size记录的是最新的最长序列长度// temp_size是出现了新的连续序列,此时的长度,初值设为1,因为pre_num的存在,长度至少为1 了int i, j, max_size = 0, temp_size = 1; // pre_num是用来记录当前数的前一个值的int pre_num = *new_nums.begin(); // 记录第一个值for(auto new_num: new_nums){if(new_num == pre_num + 1){temp_size ++; //连续了,temp_size的值++}else{// 并不连续max_size = max(max_size, temp_size); //更新max_size的值temp_size = 1; //标记为1, 出现了新的连续数字串}pre_num = new_num; // pre_num的值更新一下}// 最后还需要更新一下 max_size的值,我就忘了max_size = max(max_size, temp_size);return max_size;}
};
二、双指针
你们有没有这种感觉,对双指针迷迷糊糊的,只能说太强了,变换多样,经典的还是滑动窗口,想想都痛苦~~~
(一)移动零
2025.10.11(看论文真的看不下去了,做道简单题休息一下,哈哈,说着玩的——严肃!!)
283. 移动零 - 力扣(LeetCode)
发现并不简单,我还是回去看论文吧,不想做了,明天写……
主要是记录并监督自己每天练题的,题解也写得比较简略,如有问题,欢迎指正,谢谢。