leetcode算法刷题记录---5

news2024/9/9 0:47:13

二叉树的右视图(leetcode199)

C++

#include <vector>
#include <queue>
using namespace std;
// 二叉树的右视图
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    vector<int> rightSideView(TreeNode *root) {
        vector<int> ans;
        if(root== nullptr) return ans;
        queue<TreeNode*>q;
        q.push(root);
        while (!q.empty()){
            int layer_len = q.size();
            for(int i=0;i<layer_len;i++){
                TreeNode *data = q.front();
                if(data->left) q.push(data->left);
                if(data->right) q.push(data->right);
                if(i==layer_len-1) ans.push_back(data->val);
                q.pop();
            }
        }
        return ans;
    }
};

Python

from typing import Optional,List
# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        ans = []
        # 定义一个队列,进行层序遍历
        item = [root]
        while item:
            layer_length= len(item)
            for i in range(layer_length):
                data = item.pop(0)
                if data.left:
                    item.append(data.left)
                if data.right:
                    item.append(data.right)
                if i==layer_length-1:
                    ans.append(data.val)
        return ans

反转链表||(leetcode92)

C++

struct ListNode {
    int val;
    ListNode *next;

    ListNode() : val(0), next(nullptr) {}

    ListNode(int x) : val(x), next(nullptr) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode *reverseBetween(ListNode *head, int left, int right) {
        if (right == left) return head;
        // 设置虚拟头节点
        ListNode *dummy = new ListNode(0, head);
        ListNode *p = dummy;
        // 寻找到left
        while(left>1){
            head = head->next;
            p = p->next;
            left--;
            right--;
        }
        // 头插法反转链表,执行right-left次结束
        ListNode * r;
        while (right>left){
            r = head->next;
            head->next = r->next;
            r->next = p->next;
            p->next=r;
            right--;
        }
        r = dummy->next;
        delete dummy;
        return r;
    }
};

Python

from typing import Optional
# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        if right==left:
            return head
        # 思路:找到left,使用头插法反转链表,直到right-left次后结束
        # 定义一个虚拟头节点
        dummy = ListNode(0,head)
        # 指针p指向left的上一个节点,head指向需要反转的节点,r指向待反转节点
        p = dummy
        while left>1:
            head = head.next
            p = p.next
            left-=1
            right-=1
        # 头插法反转链表
        while right>left:
            r = head.next
            head.next = r.next
            r.next = p.next
            p.next = r
            right-=1
        return dummy.next

if __name__ == '__main__':
    # head = ListNode(3,ListNode(5,None))
    head = ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,None)))))
    left = 2
    right = 4
    s = Solution()
    res = s.reverseBetween(head,left,right)
    while res:
        print(res.val)
        res = res.next

复原IP地址(leetcode93)

C++

#include <vector>
#include <string>
#include <iostream>
using namespace std;

class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> ans;
        if (s.length()>12 || s.length()<4) return ans;
        string ip; // 记录正确的ip
        int i = 1; // 用于表示当前正在处理第i个整数
        processIpAddresses(s,i,ip,ans);
        return ans;
    }
    void processIpAddresses(string subs, int i, string ip, vector<string> &ans){
        // 检查空串和长度是否符合
        if(subs.empty() || subs.length()>(5-i)*3)
            return;
        // 是否为最后一个
        if(i==4 && stoi(subs)<=255){
            if(subs.length()>1 && subs[0]=='0') return;
            ans.push_back(ip+subs);
            return;
        }

        // 切分1至3个字符进行判断
        for(int j=1;j<4 && j<subs.length();j++){
            string tmp = subs.substr(0,j);
            // 不能是0开头的非零整数,不能大于255
            if(tmp.length()>1 && tmp[0]=='0')
                return;
            if (stoi(tmp)>255)
                return;
            // 符合要求进入下一轮
            processIpAddresses(subs.substr(j),i+1,ip+tmp+".",ans);
        }

    }
};

int main(){
    string s = "25525511135";
    //string s = "0000";
    //string s = "101023";
    Solution solution;
    vector<string> ans=solution.restoreIpAddresses(s);
    for (auto it : ans) {
        cout << it << " ";
    }
    cout << endl;
    return 0;
}

Python

from typing import List
# 复原ip
class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        if len(s)>12 or len(s)<4:
            return []
        ip =''
        ans = []
        # 处理
        self.processIpAddresses(s,1,ip,ans)
        return ans

    def processIpAddresses(self,subs,i,ip,ans):    # subs为第i个整数往后子字符串,i为第i个整数,ans储存结果
        if len(subs)==0:
            return
        if i == 4 and int(subs)<=255:
            # 去除0开头的非0整数
            if len(subs)>1 and subs[0]=="0":
                return
            ans.append(ip+subs)
            return
        # 长度不符合
        if len(subs)>(5-i)*3:
            return
        # 切分1到3个字符作为第i个整数
        for j in range(1,4):
            tmp = subs[:j]
            # 去除0开头的非0整数
            if j>1 and tmp[0]=='0':
                return
            # 判断范围
            if int(tmp)>255:
                return
            # 都满足则进入下一个阶段
            self.processIpAddresses(subs[j:],i+1,ip+tmp+".",ans)

if __name__ == '__main__':
    # s = "25525511135"
    s = "0000"
    # s = "101023"
    sulution = Solution()
    ans = sulution.restoreIpAddresses(s)
    print(ans)

环形链表(leetcode141)

C++

using namespace std;
struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(nullptr) {}
     };

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head== nullptr) return false;
        // 定义快慢指针
        ListNode *fast = head;
        ListNode *slow = head;
        while(fast && fast->next){
            fast = fast->next->next;
            slow = slow->next;
            if(fast==slow) return true;
        }
        return false;
    }
};

Python

from typing import Optional
# 环形链表
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    def hasCycle(self, head: Optional[ListNode]) -> bool:
        if not head:
            return False
        # 定义快慢指针
        fast = head
        slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if slow==fast:
                return True
        return False

环形链表||(leetcode142)

C++

// 环形链表||
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if (head == nullptr) return nullptr;
        // 定义快慢指针
        ListNode *fast = head;
        ListNode *slow = head;
        while (fast && fast->next){
            fast = fast->next->next;
            slow = slow->next;
            if(fast==slow){
                while(head != slow){
                    slow = slow->next;
                    head = head->next;
                }
                return slow;
            }
        }
        return nullptr;
    }
};

Python

from typing import Optional
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        # 定义快慢指针
        fast = head
        slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if fast==slow:
                while head != slow:
                    head = head.next
                    slow = slow.next
                return slow
        return None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“数说”巴黎奥运会上的“中国智造”成果

引言&#xff1a;随着“中国智造”在欧洲杯上方兴未艾&#xff0c;在巴黎奥运会上&#xff0c;中国智造继续以多种形式和领域展现了其强大的实力和创新能力。以格力公开表示将为巴黎奥运村提供345台格力空调&#xff0c;为中国制造的清凉送至巴黎事件拉开中国制造闪亮巴黎奥运会…

CTF Web SQL注入 10000字详解

这里写目录标题 涉及的数据库知识unionorder bydatabase()information_schemalimit--空格注释replaceinto outfilelikeGROUP BYHAVINGGROUP BY、HAVING、WHERE之间的关系regexp 原理信息收集操作系统数据库判断注入点注入点类型POST注入数字型注入字符型注入搜索型注入Insert/u…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…

ArchLinux部署waydroid

在Arch Linux系统上部署Waydroid运行Android APP 文章目录 在Arch Linux系统上部署Waydroid运行Android APP1. 安装要求2. 本机环境3. 安装 Waydroid4. 网络配置5.注册Google设备6. 运行效果图 Waydroid是Anbox配合Haliun技术开发的LXC Android容器&#xff0c;可在GUN/Linux系…

C语言中的指针基础

文章目录 &#x1f34a;自我介绍&#x1f34a;地址&#x1f34a;C语言中的指针 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要变强&am…

Spring Boot 3 + Resilience4j 简单入门 + Redis Cache 整合

1. 项目结构 2. Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</version><relativePath/> <!-- lookup parent from repository --&…

CSRF Token 原理

CSRF 攻击 CSRF 攻击成功的关键是&#xff0c;恶意网站让浏览器自动发起一个请求&#xff0c;这个请求会自动携带 cookie &#xff0c;正常网站拿到 cookie 后会认为这是正常用户&#xff0c;就允许请求。 防范 如果在请求中加一个字段&#xff08;CSRF Token&#xff09;&am…

C++笔记之指针基础

函数重载:(C++特性) 定义: C++允许函数重名,但是参数列表要有区分 在相同的作用域定义同名的函数,但是它们的参数要有所区分,这样的多个函数构成重载关系 objdump -d test.exe >log.txt 将test.exe反汇编并将结果重定向到log.txt 文件中 ,然后在 log.txt中找到定…

学习网络安全 为什么Linux首择Kali Linux? 以及如何正确的使用Kali Linux

1.什么是kali linux&#xff1f; Kali Linux是一款基于Debian的Linux发行版&#xff0c;主要用于网络安全测试和渗透测试。它由全球顶尖的安全专家和黑客社区维护开发&#xff0c;提供了丰富的工具和资源&#xff0c;用于测试安全性、漏洞利用和渗透测试。此外&#xff0c;Kal…

MySQL 性能调优

文章目录 一. MySQL调优金字塔1. 架构调优2. MySQL调优3. 硬件和OS调优4. 小结 二. 查询性能调优三. 慢查询1. 概念2. 优化数据访问3. 请求了不需要数据&#xff0c;怎么做4. 是否在扫描额外的记录5. 慢查询相关配置 & 日志位置6. 小结 四. 查询优化器五. 实现调优手段 一.…

24、Python之面向对象:责任与自由,私有属性真的有必要吗

引言 前面我们进一步介绍了类定义中属性的使用&#xff0c;今天我们对中关于属性私有化的话题稍微展开聊一下&#xff0c;顺便稍微理解一下Python设计的相关理念。 访问级别 在其他编程语言中&#xff0c;比如Java&#xff0c;关于类中的属性和方法通过关键字定义明确的访问级…

1、仓颉工程基础操作 cjpm

文章目录 1. 仓颉工程创建方式2. cjpm2.1 init 初始化工程2.2 run 运行工程 1. 仓颉工程创建方式 使用 cangjie studio 通过cangjie studio 创建 使用vscode插件 通过 VSCode 命令面板创建仓颉工程通过可视化界面创建仓颉工程 cjpm 注&#xff1a;具体使用参考官方文档&#…

探索分布式光伏运维系统的组成 需要几步呢?

前言 随着光伏发电的不断发展&#xff0c;对于光伏发电监控系统的需求也日益迫切&#xff0c;“互联网”时代&#xff0c;“互联网”的理念已经转化为科技生产的动力&#xff0c;促进了产业的升级发展&#xff0c;本文结合“互联网”技术提出了一种针对分散光伏发电站运行数据…

浅谈Devops

1.什么是Devops DevopsDev&#xff08;Development&#xff09;Ops&#xff08;Operation&#xff09; DevOps&#xff08;Development和Operations的混合词&#xff09;是一种重视“软件开发人员&#xff08;Dev&#xff09;”和“IT运维技术人员&#xff08;Ops&#xff09;”…

asp.net mvc 三层架构开发商城系统需要前台页面代完善

一般会后端开发&#xff0c;都不太想写前台界面&#xff0c;这套系统做完本来想开源&#xff0c;需要前台界面&#xff0c;后台已开发&#xff0c;有需求的朋友&#xff0c;可以开发个前端界面完善一下&#xff0c;有的话可以私聊发给我啊

The Llama 3 Herd of Models 第6部分推理部分全文

第1,2,3部分 介绍,概览和预训练 第4部分 后训练 第5部分 结果 6 Inference 推理 我们研究了两种主要技术来提高Llama 3405b模型的推理效率:(1)管道并行化和(2)FP8量化。我们已经公开发布了FP8量化的实现。 6.1 Pipeline Parallelism 管道并行 当使用BF16数字表示模型参数时…

VirtualBox创建共享磁盘

VirtualBox创建共享磁盘 目录 VirtualBox创建共享磁盘1、划分共享磁盘1.1、【管理】->【工具】->【虚拟介质管理】1.2、【创建】->【VDI&#xff08;VirtualBox 磁盘映像&#xff09;】->【下一步】1.3、【预先分配全部空间】->【下一步】1.4、【分配大小】->…

5、springboot3 vue3开发平台-后端- satoken 整合

文章目录 1. 为什么使用sa-token2. 依赖导入jichu2.1 基础依赖引入2.2 redis整合2.3 redis 配置&#xff0c; 使redis能支持中文存储 3. 配置4. 配置使用4.1 权限加载接口实现&#xff0c; 登录实现4.2 配置全局过滤器4.3 登录异常处理 5. 登录测试6. 用户session的获取 1. 为什…

MySQL索引与存储引擎、事物

数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址 无须对整个表进行扫描&#xff0c;通过物理地址就可以找到所需数据 是表中一列或者若干列值排序的方法 需要额外的磁盘空间 类型 普通索引 最基本的索引类型&#xff0c;没有唯一性之类的限制 创…

图不连通怎么办?

目录 1.问题 2.连通的相关概念 3.解决方案 C语言示例实现&#xff1a; 1.问题 无论是图的深度还是广度遍历都是从图的某一条边往下走&#xff0c;那么被孤立的结点怎么被遍历到呢&#xff1f; 2.连通的相关概念 连通&#xff1a;如果从V到W存在一条&#xff08;无向&#…