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

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

相关推荐
2401_841495641 小时前
【LeetCode刷题】跳跃游戏Ⅱ
数据结构·python·算法·leetcode·数组·贪心策略·跳跃游戏
rannn_1112 小时前
【SQL题解】力扣高频 SQL 50题|DAY5
数据库·后端·sql·leetcode·题解
LYFlied3 小时前
【每日算法】LeetCode 279. 完全平方数(动态规划)
前端·算法·leetcode·面试·动态规划
努力学算法的蒟蒻3 小时前
day43(12.24)——leetcode面试经典150
算法·leetcode·面试
元亓亓亓4 小时前
LeetCode--279. 完全平方数--中等
算法·leetcode·动态规划
历程里程碑5 小时前
LeetCode128:哈希集合巧解最长连续序列
开发语言·数据结构·c++·算法·leetcode·哈希算法·散列表
iAkuya6 小时前
(leetcode)力扣100 22相交链表(双指针)
算法·leetcode·链表
Binky6787 小时前
力扣--贪心篇(1)
数据结构·算法·leetcode
月明长歌7 小时前
【码道初阶】【LeetCode387】如何高效找到字符串中第一个不重复的字符?
java·开发语言·数据结构·算法·leetcode·哈希算法
源代码•宸17 小时前
Leetcode—620. 有趣的电影&&Q3. 有趣的电影【简单】
数据库·后端·mysql·算法·leetcode·职场和发展