11.7 leetcode打卡
原题链接:448. 找到所有数组中消失的数字
题目描述
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
解题思路
原址
代码实现
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; i++) {
int x = (nums[i] - 1)%n; //用原数组的数字来当作下标对数组进行操作
nums[x] += n; //如果该下标出现在[1~n]中,则其对应的数字+n
}
vector<int> ret;
for (int i = 0; i < n; i++) {
cout<<i<<" "<<nums[i]<<" "<<endl;
if (nums[i] <= n) { //若数组中仍存在小于等于n的数字
ret.push_back(i + 1); //下标没在上述数组中出现过
}
}
return ret;
}
};
17.电话号码的字母组合
原题链接:17. 电话号码的字母组合
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
{{2, “abc”}, {3, “def”}, {4, “ghi”}, {5, “jkl”}, {6, “mno”}, {7, “pqrs”}, {8, “tuv”}, {9, “wxyz” }}
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
解题思路
常规思路
此处可用哈希表存储,key即为数字2-9,value即为2-9所对应的字符串。
题目所求为所给数字对应字母的字符串的所有组合方式,所以我们可用宽度优先搜索+回溯,记录每一种可能的组合方式。
代码实现
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> ans;
if(digits.empty()){ return ans; }
string str;
unordered_map<int, string> map = {{2, "abc"}, {3, "def"}, {4, "ghi"}, {5, "jkl"},
{6, "mno"}, {7, "pqrs"}, {8, "tuv"}, {9, "wxyz" }};
bfs(ans, map, digits, 0, str);
return ans;
}
void bfs(vector<string>& ans, unordered_map<int, string>& map, string& digits, int index, string cur){
if(index == digits.length()){ //如果当前所有的位数已经选完,则将所选的组合方式加入结果集中
ans.push_back(cur);
}else{
int num = digits[index] - '0';
string str = map.at(num); //当前数字所对应的可选字符串
for(char& letter : str){
cur.push_back(letter); //选中当前字符
bfs(ans, map, digits, index + 1, cur); //进入下一位的选择
cur.pop_back(); //恢复现场(不选当前字符)
}
}
}
};
49.字母异位词分组
原题链接:49. 字母异位词分组
题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解题思路
常规思路
由题可知,每个字符串中所包含的字符都是一样的,只是顺序不同,我们可以把它按相同的规律进行排序(字典序),若排序后一样,则它们互为字母异位词。
此处可用哈希表,我们将排序后的字符串作为key,将所有排序后相同的且与key对应的字符串放入value的集合中。
然后遍历哈希表,依次添加到结果集中即为所求。
代码实现
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
int n = strs.size();
unordered_map<string, vector<string>> map;
for(int i = 0; i < n; ++ i){
string str = strs[i];
sort(str.begin(), str.end()); //对其进行排序
map[str].push_back(strs[i]); //若排序后所对应的value相同则加入其对应的vector中
}
for (auto it = map.begin(); it != map.end(); ++it) { //遍历哈希表,将哈希表中所有的集合加入到返回结果中
ans.emplace_back(it->second);
}
return ans;
}
};