0x01_实验课leetcode

news/2024/7/20 22:37:53 标签: leetcode, 深度优先, 算法

题目总结

lc1979

给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。

两个数的 最大公约数 是能够被两个数整除的最大正整数。

会求 gcd 就行

class Solution {
public:
    int gcd(int a, int b){
        return b ? gcd(b, a % b) : a;
    }
    int findGCD(vector<int>& nums) {
        int mn = 2e9, mx = -2e9;
        for(auto x : nums){
            mn = min(mn, x);
            mx = max(mx, x);
        }
        return gcd(mn, mx);
    }
};

lcr024

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

  • sol1

将链表结点加入数组,生成一个新链表(不会之举)

/**
 * Definition for singly-linked list.
 * 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* reverseList(ListNode* head) {
        vector<int> nums;
        while(head != nullptr){
            nums.push_back(head -> val);
            head = head -> next;
        }
        int sz = nums.size();
        ListNode *p = new ListNode;
        p -> next = nullptr;
        for(auto x : nums){
            cout << x << ' ';
            ListNode *tmp = new ListNode(x);
            tmp -> next = p -> next;
            p -> next = tmp;
        }
        return p -> next;
    }
};
// 暴力写法 : 存下链表值, 重新生成链表
  • sol2

迭代处理,让当前节点指向左边的结点

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *pre = nullptr;
        while(head != nullptr){
            ListNode *tmp = head -> next;
            head -> next = pre;
            pre = head;
            head = tmp;
        } 
        return pre;
    }
};
  • sol3

递归处理, dfs 一路搜到尾结点指向的 nullptr ,返回尾结点,一路回溯过程中,令每个结点都指向 pre 结点,最后返回从一路回溯上来的尾结点

class Solution {
public:
    ListNode* dfs(ListNode* now, ListNode* pre){
        if(now == nullptr) return pre; // 一路递归返回头结点
        ListNode* res = dfs(now -> next, now);
        now -> next = pre;
        return res;
    }
    ListNode* reverseList(ListNode* head) {
        return dfs(head, nullptr);
    }

};

汉诺塔问题

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

处理 n n n 个盘子,递归为处理 n − 1 n-1 n1 个盘子

class Solution {
public:
    // 把 n 个盘子从 A 移动到 C 借助 B
    void op(int n, vector<int> &A, vector<int> &B, vector<int> &C){
        if(n == 1){ // 递归终止
            C.push_back(A.back());
            A.pop_back();
            return ;
        }
        op(n - 1, A, C, B);
        C.push_back(A.back());
        A.pop_back();
        op(n - 1, B, A, C);
    }
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) { // 表示从 A 移动到 C, 借助 B
        op(A.size(), A, B, C);
    }
};

翻转二叉树

给定一棵二叉树的根节点 root,请左右翻转这棵二叉树,并返回其根节点。

递归处理,将原二叉树左子树作为新二叉树右子树,将原二叉树右子树作为新二叉树左子树;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* mirrorTree(TreeNode* root) {
        if(root == nullptr) return nullptr;
        TreeNode* newRoot = new TreeNode(root -> val);
        newRoot -> left = mirrorTree(root -> right);
        newRoot -> right = mirrorTree(root -> left);
        return newRoot;
    }
};

lcr051

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。

一道比较好写的树形 dp

/**
 * Definition for a binary tree node.
 * 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) {}
 * };
 */
 // dp[u] 表示以 u 为根节点的子树且选择 u 作为路径的一个结点所能得到的最大路径点
 // 更新dp : dp[u] = w[u] + max(dp[lson], dp[rson], 0);
 // 更新答案 : ans = max(ans, w[u] + max(dp[lson], 0) + max(dp[rson], 0));
class Solution {
public:
    int ans = - 2e9;
    map<TreeNode*, int> dp;
    void dfs(TreeNode* r){
        if(r == nullptr) return ;
        dp[r] = r -> val;
        dfs(r -> left);
        dfs(r -> right);
        dp[r] += max({dp[r -> left], dp[r -> right], 0});
        ans = max(ans, r -> val + max(0, dp[r -> left]) + max(0, dp[r -> right])); 
    }
    int maxPathSum(TreeNode* root) {
        dfs(root);
        return ans;
    }
};

http://www.niftyadmin.cn/n/5446396.html

相关文章

19.C++20中的std::latch和std::barrier

文章目录 线程闩std::latch和线程卡std::barrier线程闩std::latch线程卡std::barrier的使用线程闩std::latch和线程卡std::barrier的区别reference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 线程闩std::latch和线程卡std::barrier …

001-Windows下PyTorch极简开发环境配置(上)

本节介绍Windows系统下配置一套基于Pytorch框架的极简深度学习开发环境。 目录 0.1 缘起 0.1 缘起 其实大概在2016就开始接触深度学习的相关知识&#xff0c;但一直到2018年左右&#xff0c;还停留在门外汉的状态太&#xff0c;原因很简单&#xff0c;感觉学习的门槛过高。…

【LeetCode】升级打怪之路 Day 27:回溯算法 — 单词拆分问题

今日题目&#xff1a; 140. 单词拆分 II139. 单词拆分 参考文章&#xff1a;回溯算法&#xff1a;单词拆分 今天主要做了两道单词拆分的问题&#xff0c;都是需要使用回溯算法来解决&#xff0c;第一个题目难度不大&#xff0c;第二个题目需要在“剪枝”上多做一些功夫&#xf…

pytorch 训练实时checkpoint保存;训练中断恢复

1、训练实时checkpoint保存 一般是torch save保存相关权重及训练参数 # 训练和测试循环 for epoch in range(start_epoch, epochs + 1):train(model, device, train_loader, optimizer, criterion, epoch)test(model, device

C++ —— 日期计算器

1. 头文件 #pragma once #include <iostream> using namespace std;class Date { public:Date(int year 1, int month 1, int day 1);int GetMonthDay();bool operator>(const Date& d) const;bool operator>(const Date& d)const;bool operator<(c…

【JavaEE初阶系列】——synchronized 的特性(互斥和可重入性)

目录 &#x1f4bb;synchronized 的特性 &#x1f5a5;️互斥及使用示例 &#x1f6a9;锁修饰代码块 &#x1f6a9;锁修饰实例方法/静态方法 &#x1f388;锁修饰实例方法 &#x1f388;锁修饰静态方法 &#x1f6a9;总结 &#x1f5a5;️可重入 &#x1f6a9;死锁的…

光伏知识|户用光伏太阳能板如何选择?

随着新能源的不断发展&#xff0c;户用光伏作为一种绿色、可再生的能源设备&#xff0c;受到越来越多人的关注。许多人在建设光伏电站时&#xff0c;因选择怎样的光伏太阳能板而头疼&#xff0c;本文将详细介绍选购的要素。 1.转换率 光伏太阳能板的转换率是指它将太阳光转化…

实在智能受邀参加中国人工智能产业发展联盟大会(AIIA)主题分享,共筑智能体机遇新篇章

近日&#xff0c;中国人工智能产业发展联盟&#xff08;AIIA&#xff09;在海口召开第十一次全体会议&#xff0c;作为该联盟成员单位&#xff0c;实在智能合伙人&核心算法负责人欧阳小刚受邀出席大会&#xff0c;并以《从RPA到智能体&#xff0c;数字员工的发展及在金融行…