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. 简单场景 → 暴力法(小数据量)
相关推荐
AI软著研究员14 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish14 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱15 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱2 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法