leetcode刷题:vector刷题

发布于:2024-07-03 ⋅ 阅读:(46) ⋅ 点赞:(0)


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

🔥个人主页guoguoqiang. 🔥专栏leetcode刷题

Alt

1.只出现一次的数字

在这里插入图片描述
这道题很简单,我们只需要遍历一次数组即可通过异或运算实现。(一个数与自身异或结果为0,任何数与0异或还是它本身)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int value=0;
        for(auto e:nums){
            value^=e;
        }
        return value;
    }
};

2.杨辉三角

这里是引用
这个题需要创建一个二维数组,开辟空间
vector<vector> vv , vv.resize(numRows)
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv;
        vv.resize(numRows);
        for(int i=0;i<numRows;i++){
            vv[i].resize(i+1,0);
            vv[i][0]=vv[i][vv[i].size()-1]=1;
        }
        for(int i=0;i<numRows;i++){
            for(int j=0;j<i;j++){
                if(vv[i][j]==0){
                    vv[i][j]=vv[i-1][j]+vv[i-1][j-1];
                }
            }
        }
        return vv;
    }
};

3.删除有序数组中的重复项

这里是引用
双指针,如果fast的前一个与fast相同,则对前面的值进行修改。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n=nums.size();
        if(n==0){
            return 0;
        }
        int slow=1,fast=1;
        while(fast<n){
            if(nums[fast-1]!=nums[fast]){
                nums[slow]=nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
};

4.只出现一次的数组 二

在这里插入图片描述

//方法一 : 异或
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ones = 0, twos = 0;       
        for (int num : nums) {
            ones = (ones ^ num) & ~twos;
            twos = (twos ^ num) & ~ones;
        }
        return ones;
    }
};

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        unordered_map<int,int>freq;
        for(int num:nums){
            ++freq[num];
        }
        int ans=0;
        for(auto [num,occ]:freq){
            if(occ==1){
                ans=num;
                break;
            }
        }
        return ans;
    }
};

5.只出现一次的数字 三

在这里插入图片描述

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {//哈希表
        vector<int> ans;
        unordered_map<int,int>freq;
        for(int num:nums){
            ++freq[num];
        }
        for(auto [num,occ]:freq){
            if(occ==1){
                ans.push_back(num);
            }
        }
        return ans;
    }
};
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        // 第一步,对所有元素进行异或,最终的结果就是两个只出现一次数的异或结果
        int diff = 0;
        for (int num : nums) {
            diff ^= num;
        }
        
        // 找到diff中任何为1的位,可以使用diff & -diff快速找到
        // 这个操作可以隔离出diff最右端的1
        unsigned int diff_unsigned = diff;
        diff_unsigned &= -diff_unsigned;

        // 使用找到的这一位将数组中的数字分成两组
        vector<int> results(2, 0); // 最终结果
        for (int num : nums) {
            if ((num & diff_unsigned) == 0) {
                // 第一组,与diff_unsigned对应位为0
                results[0] ^= num;
            } else {
                // 第二组,与diff_unsigned对应位为1
                results[1] ^= num;
            }
        }
        
        return results;
    }
};

6.电话号码的字母组合

在这里插入图片描述

class Solution {//回溯算法。
public:
    vector<string> letterCombinations(string digits) {
        if(digits.empty()) return{};
         vector<string> mappings = {  // 数字到字母的映射
            "", "", "abc", "def",   // '0','1','2',...
            "ghi", "jkl", "mno",
            "pqrs", "tuv", "wxyz"
        };
        vector<string> result;
        string current;
        
        backtrack(result, digits, 0, current, mappings);
        
        return result;
    }
    private:
  void backtrack(vector<string>& result, const string& digits, 
                   int index, string& current, const vector<string>& mappings) {
                        if(index==digits.length()){
                            result.push_back(current);
                            return;
                        }
                           string letters = mappings[digits[index] - '0']; // 获取当前数字对应的所有字母
        for (char letter : letters) { // 遍历这些字母
            current.push_back(letter);   // 添加当前的字母
            backtrack(result, digits, index + 1, current, mappings);  // 继续处理下一个数字
            current.pop_back();  // 回溯,移除当前字母,以便尝试下一个字母
        }
    }
};

网站公告

今日签到

点亮在社区的每一天
去签到