当前位置: 首页 > news >正文

leetcode竞赛:20220918周赛

整体比较简单

题目一 6180. 最小偶倍数

class Solution {
public:
    int smallestEvenMultiple(int n) {
        if (n & 1) return n << 1;
        return n;
    }
};

题目二 6181. 最长的字母序连续子字符串的长度

暴力或者双指针都可以

class Solution {
public:
    int longestContinuousSubstring(string s) {
        int n = s.size(), res = 1;
        int i = 0, j = 1;
        for (; j < n; j++) {
            if (s[j] != s[j - 1] + 1) {
                res = max(res, j - i);
                i = j;
                continue;
            }
        }
        
        return max(res, j - i);
    }
};

双指针时,避免最后一部分没有被枚举到的办法是以前指针作为枚举指针。

class Solution {
public:
    int longestContinuousSubstring(string s) {
        int res = 0;
        for (int i = 0; i < s.size(); i ++ ) {
            int j = i + 1;
            while (j < s.size() && s[j] == s[j - 1] + 1) j ++ ;
            res = max(res, j - i);
            i = j - 1;
        }
        return res;
    }
};

题目三 6182. 反转二叉树的奇数层

典型层序遍历。思考复杂度:最多 2 14 2^{14} 214个节点,那么每层最多 2 13 2^{13} 213个节点,也就是每层最多 8 ∗ 1 0 3 8 * 10^3 8103个节点,不算多。第一次看 2 14 2^{14} 214,以为很多。

class Solution {
public:
    TreeNode* reverseOddLevels(TreeNode* root) {
        deque<TreeNode*>que;
        que.push_back(root);
        int curL = 0;
        while(!que.empty()) {
            int n = que.size();
            
            for (int i = 0, j = n - 1; i < n; i++, j--) {
                TreeNode* cur = que[i];
                if (cur->left) {
                    que.push_back(cur->left);
                    que.push_back(cur->right);
                }
                
                if ((curL % 2) && i < j) {
                    // cout << curL << " " << que[i]->val << que[j]->val << endl;
                    swap(que[i]->val, que[j]->val);
                }
            }
            que.erase(que.begin(), que.begin() + n);
            curL++;
        }
        return root;
    }
};

可以用深度优先遍历,做镜像遍历,这个思想很好。代码也很漂亮。
这个dfs的每一层的两个节点,都是左右两棵子树镜像分布的。

class Solution {
public:
    TreeNode* reverseOddLevels(TreeNode* root) {
        dfs(root->left, root->right, 1);
        return root;
    }
    void dfs(TreeNode* left, TreeNode* right, int d) {
        if (!left) return ;
        dfs(left->left, right->right, d + 1);
        dfs(left->right, right->left, d + 1);
        if (d & 1) swap(left->val, right->val);
        return ;  
    }
};

6183. 字符串的前缀分数和

近几次做的最容易的4题。超时一次,因为忽略了哈希的时间复杂度。如果直接以哈希前缀字符串来做,时间复杂度是 O ( n 3 ) O(n^3) O(n3) ,数据量1000是过不了的。应该用Trie树优化。Trie树是一种听着难,写起来比想象中容易的多的数据结构。

class Solution {
public:
    struct Treenode {
        int ct = 0;
        Treenode *next[30] = {nullptr};
    };
    class Trie {
        public:
        Trie() {
            root = new Treenode();
        }
        Treenode *root;
        void update(const string& s) {
            Treenode *cur = root;
            for (int i = 0; i < s.size(); i++) {
                char c = s[i];
                int id = c - 'a';
                if (!cur->next[id]) cur->next[id] = new Treenode();
                cur->next[id]->ct++;
                cur = cur->next[id];
            }
            
        }
        int find(const string& s) {
            Treenode *cur = root;
            int res = 0;
            for (int i = 0; i < s.size(); i++) {
                char c = s[i];
                int id = c - 'a';
                if (!cur->next[id]) cur->next[id] = new Treenode();
                res += cur->next[id]->ct;
                cur = cur->next[id];
            }
            return res;
        }
    };
    vector<int> sumPrefixScores(vector<string>& words) {
        unordered_map<string, int> ai;
        Trie root;
        for (auto s: words) {
            root.update(s);
        }
        vector<int> res;
        for (auto s: words) {
            int r = root.find(s);
            res.push_back(r);
        }
        return res;
    }
};

相关文章:

  • 牛客刷题,python入门基础(11)
  • 循序渐进学Git(可复习)
  • 力扣 6181. 最长的字母序连续子字符串的长度
  • Chapter8:控制系统状态空间分析
  • 基于Java+Springboot+vue体育用品销售商城平台设计和实现
  • uboot源码分析(基于S5PV210)之uboot的硬件驱动部分
  • iptables之SNAT,DNAT原理与DNS分离解析实验
  • 基于Web技术的优秀电影片段赏析与交流系统
  • Android案例手册 - 实现一个华容道拼图游戏
  • 软件设计师笔记-----系统安全分析与设计
  • 「Nature领衔」8月BIOTREE成功助力发表文章17篇,总IF:190+!
  • 高分二号卫星影像下载
  • JMeter与Selenium WebDriver集成的价值
  • 数据湖浅析(以hudi为例)
  • 嵌入式分享合集60
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • ES2017异步函数现已正式可用
  • HTTP请求重发
  • JS笔记四:作用域、变量(函数)提升
  • Lsb图片隐写
  • Objective-C 中关联引用的概念
  • Python中eval与exec的使用及区别
  • underscore源码剖析之整体架构
  • vue-cli3搭建项目
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 力扣(LeetCode)22
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 详解NodeJs流之一
  • 以太坊客户端Geth命令参数详解
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​iOS实时查看App运行日志
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #预处理和函数的对比以及条件编译
  • (+4)2.2UML建模图
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (day 12)JavaScript学习笔记(数组3)
  • (八)c52学习之旅-中断实验
  • (分布式缓存)Redis分片集群
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)http协议
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Remoting常用部署结构
  • .Net Web窗口页属性
  • .net 获取url的方法