力扣469A

文章目录

  • [1. 题目链接](#1. 题目链接)
  • [2. 题目代码](#2. 题目代码)
  • [3. 题目总结](#3. 题目总结)
  • [4. 代码分析](#4. 代码分析)

1. 题目链接

I Wanna Be the Guy

2. 题目代码

cpp 复制代码
#include<iostream>
#include<set>
using namespace std;
int main(){
    int highestLevelOfGame;
    cin >> highestLevelOfGame;

    set<int> levelCanPass;

    int levelOfXPass;
    cin >> levelOfXPass;
    int level;
    while(levelOfXPass --){
        cin >> level;
        levelCanPass.insert(level);
    }

    int levelOfYPass;
    cin >> levelOfYPass;
    while(levelOfYPass --){
        cin >> level;
        levelCanPass.insert(level);
    }
    
    if(levelCanPass.size() == highestLevelOfGame){
        cout << "I become the guy.";
    }else{
        cout << "Oh, my keyboard!";
    }

    return 0;
}

3. 题目总结

用时:31min

卡住原因:审题不清 -- 以为整个第二行都是X可以通过的等级,第三行都是Y可以通过的等级,从而认为第二、三的数据个数无法判断。于是想到用string类型的数据获取二、三行数据(考虑到有空格,输入方式应该采用getline(cin, 字符串名) )。接下来的代码实现我考虑了两个方案:① 使用双重for循环。第一层循环遍历游戏的等级(1-n),第二层循环遍历X、Y可以通过的等级。看看是否X、Y是否包含1到n的所有数值。② 单重循环。但是要把X、Y字符串里的所有数据先整合到一个set容器里。

4. 代码分析

参照代码来源:

注:set.count()

cpp 复制代码
#include <iostream>
#include <set>

using namespace std;

int main() {
    int n;
    cin >> n;

    set<int> x_levels, y_levels;

    int p;
    cin >> p;
    for (int i = 0; i < p; ++i) {
        int level;
        cin >> level;
        x_levels.insert(level);
    }

    int q;
    cin >> q;
    for (int i = 0; i < q; ++i) {
        int level;
        cin >> level;
        y_levels.insert(level);
    }

    bool can_pass_all_levels = true;
    for (int i = 1; i <= n; ++i) {
        if (!(x_levels.count(i) || y_levels.count(i))) {
            can_pass_all_levels = false;
            break;
        }
    }

    if (can_pass_all_levels) {
        cout << "I become the guy." << endl;
    } else {
        cout << "Oh, my keyboard!" << endl;
    }

    return 0;
}

我的代码耗时:78ms

内存占用:0KB
问:为什么人家的代码比我多了一个for循环,但是比我的耗时还少?
答(回复来自gpt):
代码比对:

① 输入处理方式:

参考代码:通过明确读取 p 和 q 的值来确定循环次数,然后每次循环分别读取并插入到两个不同的 set 中。

我的代码:使用了 while 循环来处理输入,但没有显式地指定循环次数,而是依赖 levelOfXPass 和 levelOfYPass 变量来控制循环次数。这种方式可能在输入处理上引入了更多的复杂性和可能的性能开销。

集合操作:

② 集合操作:

参考代码:在判断是否可以通过所有关卡时,通过遍历从 1 到 n 的整数来检查每个关卡是否在 x_levels 或 y_levels 中。

我的代码:通过比较 levelCanPass 集合的大小和 highestLevelOfGame 的值来判断是否可以通过所有关卡。这种方法简化了判断逻辑,但在集合操作上,需要考虑集合的插入和去重操作的性能开销。
性能差异的可能原因:

① 输入操作效率:

我的代码的输入处理方式可能会比第一段代码更复杂,尤其是在处理大量输入时,可能会影响整体性能。

② 集合操作效率:

虽然两者都使用了 set 数据结构,但集合的插入操作可能受到输入量的影响。特别是我的代码中的 insert 操作可能需要更多的内部重排或重新哈希,这可能会导致性能略微下降。
优化建议:

简化输入处理逻辑,减少不必要的数据结构操作,以及选择更适合具体应用场景的数据结构和算法。

相关推荐
__AtYou__4 小时前
Golang | Leetcode Golang题解之第448题找到所有数组中消失的数字
leetcode·golang·题解
转调5 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
huanxiangcoco6 小时前
152. 乘积最大子数组
python·leetcode
希望有朝一日能如愿以偿7 小时前
力扣题解(飞机座位分配概率)
算法·leetcode·职场和发展
Espresso Macchiato7 小时前
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II
leetcode·滑动窗口·leetcode medium·leetcode 3306·leetcode周赛417
数据分析螺丝钉9 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
￴ㅤ￴￴ㅤ9527超级帅9 小时前
LeetCode hot100---数组及矩阵专题(C++语言)
c++·leetcode·矩阵
鱼跃鹰飞10 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
源代码•宸13 小时前
Leetcode—76. 最小覆盖子串【困难】
c++·经验分享·算法·leetcode·滑动窗口
百里守约学编程13 小时前
70. 爬楼梯
算法·leetcode·go