11.9 LeetCode 题目汇总与解题思路

第一题:242. 有效的字母异位词

解法1:数组计数法(最优)

复制代码
class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()) return false;
        int[] alpha = new int[26];
        for(int i=0;i<s.length();i++){
            alpha[s.charAt(i)-'a']++;
            alpha[t.charAt(i)-'a']--;
        }
        for(int i=0;i<26;i++){
            if(alpha[i]!=0) return false;
        }
        return true;
    }
}

特点

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
  • 只适用于小写字母场景

解法2:排序比较法

复制代码
class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.length()!=t.length()) return false;
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());
        return s==t;
    }
};

特点

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1) 或 O(n)(取决于排序算法)
  • 通用性强,但效率较低

解法3:哈希表法

复制代码
class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.length() != t.length()) return false;
        unordered_map<char, int> map;
        for(char c : s) map[c]++;
        for(char c : t) map[c]--;
        for(auto val : map) {
            if(val.second != 0) return false;
        }
        return true;
    }
};

特点

  • 时间复杂度:O(n)
  • 空间复杂度:O(k),k为字符集大小
  • 适用于Unicode字符

第二题:202. 快乐数

解法1:快慢指针法(Floyd判圈)

复制代码
class Solution {
public:
    int bitSqureSum(int n) {
        int sum = 0;
        while(n > 0) {
            int bit = n % 10;
            sum += bit * bit;
            n = n / 10;
        }
        return sum;
    }
    
    bool isHappy(int n) {
        int slow = n, fast = n;
        while(true) {
            fast = bitSqureSum(fast);
            fast = bitSqureSum(fast);  // 快指针走两步
            slow = bitSqureSum(slow);  // 慢指针走一步
            
            if(fast == 1) return true;   // 找到快乐数
            if(fast == slow) return false; // 进入循环
        }
    }
};

特点

  • 时间复杂度:O(logn)
  • 空间复杂度:O(1)
  • 数学证明:非快乐数最终会进入循环

解法2:哈希表记录法

复制代码
class Solution {
public:
    int bitSqureSum(int n) {
        int sum = 0;
        while(n > 0) {
            int bit = n % 10;
            sum += bit * bit;
            n = n / 10;
        }
        return sum;
    }
    
    bool isHappy(int n) {
        unordered_map<int,int> map;
        map[n] = 1;
        while(n != 1) {
            n = bitSqureSum(n);
            if(map[n] == 1) return false; // 出现重复,进入循环
            map[n] = 1;
        }
        return true;
    }
};

特点

  • 时间复杂度:O(logn)
  • 空间复杂度:O(logn)
  • 思路直观,容易理解

第三题:349. 两个数组的交集

解法1:数组哈希法

复制代码
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        int hash[10000] = {0};
        vector<int> ans;

        for(int i=0;i<nums1.size();i++) {
            hash[nums1[i]] = 1;
        }

        for(int i=0;i<nums2.size();i++) {
            if(hash[nums2[i]] == 1) {
                ans.push_back(nums2[i]);
                hash[nums2[i]] = 2;  // 标记为已添加,避免重复
            }
        }
        return ans;
    }
};

特点

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(10000)
  • 适用于数值范围已知的情况

解法2:双哈希表法

复制代码
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> map, quchong;
        vector<int> ans;
        for(int a : nums1) {
            map[a] = 1;
        }
        for(int a : nums2) {
            if(map[a] && quchong[a] != 1) {
                quchong[a] = 1;
                ans.push_back(a);
            }
        }
        return ans;
    }
};

特点

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(m)
  • 通用性强,适用于任意整数

第四题:1. 两数之和

解法1:哈希表一次遍历(最优)

复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> map;
        for(int i=0;i<nums.size();i++) {
            if(map.count(target - nums[i]))
                return {i, map[target - nums[i]]};
            map[nums[i]] = i;
        }
        return {};
    }
};

特点

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
  • 一次遍历,边查边存

解法2:暴力枚举法

复制代码
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    for(int i=0;i<numsSize;i++){
        for(int j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                *returnSize=2;
                int *ans=(int*)malloc(sizeof(int)*2);
                ans[0]=i;ans[1]=j;
                return ans;
            }
        }
    }
    *returnSize=0;
    return NULL;   
}

特点

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 思路简单,但效率低

核心技巧总结

技巧 适用场景 代表题目
数组计数 字符统计、数值范围固定 有效的字母异位词
快慢指针 循环检测、链表问题 快乐数、环形链表
哈希表记录 查找、去重、计数 两数之和、交集
排序+双指针 需要有序处理的场景 三数之和等

选择建议

  1. 字符/小范围数值 → 数组计数法
  2. 循环检测问题 → 快慢指针法
  3. 通用查找问题 → 哈希表法
  4. 简单场景 → 暴力法(小数据量)
相关推荐
青 春 记 忆22 分钟前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
阳明山水1 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技2 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
Tongzhi20262 小时前
通芝科技考勤软件三大发展趋势:AI大模型、无感识别与数据底座
大数据·科技·算法·爬山算法
eBest数字化转型方案2 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
residual_fan3 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析
s_w.h3 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
信奥卷王3 小时前
2025年09月GESPC++五级真题解析(含视频)
算法
白狐_7983 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
闻缺陷则喜何志丹3 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷