力扣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 操作可能需要更多的内部重排或重新哈希,这可能会导致性能略微下降。
优化建议:

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

相关推荐
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
jrrz08287 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
南宫生8 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
你好helloworld10 小时前
滑动窗口最大值
数据结构·算法·leetcode
sjsjs1111 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
咕咕吖12 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎13 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
~yY…s<#>14 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
linsa_pursuer16 小时前
快乐数算法
算法·leetcode·职场和发展
XuanRanDev16 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节