11.7 leetcode打卡

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;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值