第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ

news2024/12/24 15:36:28

Q1、统计符合条件长度为3的子数组数目

1、题目描述

给你一个整数数组 nums ,请你返回长度为 3 的子数组,满足第一个数和第三个数的和恰好为第二个数的一半。

子数组 指的是一个数组中连续 非空 的元素序列。

2、解题思路

我们需要在给定的数组 nums 中找出长度为 3 的子数组(即三个连续元素的子数组),满足以下条件:

  • 第一个数(nums[i-2])与第三个数(nums[i])的和,恰好是第二个数(nums[i-1])的一半

换句话说,对于任意满足条件的子数组 [nums[i-2], nums[i-1], nums[i]],需要满足数学关系:

n u m s [ i − 2 ] + n u m s [ i ] = n u m s [ i − 1 ] 2 nums[i-2] + nums[i] = \frac{nums[i-1]}{2} nums[i2]+nums[i]=2nums[i1]

或等价地:

( n u m s [ i − 2 ] + n u m s [ i ] ) × 2 = n u m s [ i − 1 ] (nums[i−2]+nums[i])×2=nums[i−1] (nums[i2]+nums[i])×2=nums[i1]

连续子数组的定义

  • 一个长度为 3 的子数组是数组中的三个连续元素。即对于数组 nums 的一个长度为 3 的子数组 [nums[i-2], nums[i-1], nums[i]],三个数的索引分别是 i-2, i-1, i

条件判断

  • 对于每一个可能的长度为 3 的子数组,只需要检查是否满足上述等式。
  • 注意,由于需要三个元素,数组的长度必须至少为 3。如果 nums.size() < 3,直接返回 0。

遍历方法

  • 从索引 i = 2 开始,检查 [nums[i-2], nums[i-1], nums[i]] 是否满足条件。
  • 遍历到数组的末尾,并统计所有满足条件的子数组的个数。

时间复杂度

  • 由于我们只需遍历数组一次,对每个子数组执行一次常数时间的计算,时间复杂度为 O(n),其中 n 是数组的长度。

3、代码实现

class Solution {
public:
    int countSubarrays(vector<int>& nums) {
        int n = nums.size();
        // 如果数组长度小于 3, 直接返回 0
        if (n < 3) {
            return 0;
        }

        int ret = 0; // 记录满足条件的子数组个数
        // 从索引 2 开始遍历数组, 检查每个长度为 3 的子数组
        for (int i = 2; i < n; ++i) {
            // 检查条件 (nums[i-2] + nums[i]) * 2 == nums[i-1]
            if ((nums[i - 2] + nums[i]) * 2 == nums[i - 1]) {
                ++ret; // 满足条件的子数组个数 +1
            }
        }

        return ret; // 返回最终结果
    }
};

在这里插入图片描述

4、复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)


Q2、统计异或值为给定值的路径数目

1、题目描述

给你一个大小为 m x n 的二维整数数组 grid 和一个整数 k

你的任务是统计满足以下 条件 且从左上格子 (0, 0) 出发到达右下格子 (m - 1, n - 1) 的路径数目:

  • 每一步你可以向右或者向下走,也就是如果格子存在的话,可以从格子 (i, j) 走到格子 (i, j + 1) 或者格子 (i + 1, j)
  • 路径上经过的所有数字 XOR 异或值必须 等于 k

请你返回满足上述条件的路径总数。

由于答案可能很大,请你将答案对 1e9 + 7 取余 后返回。

2、解题思路

我们需要计算从二维数组 grid 的左上角 (0, 0) 出发到右下角 (m-1, n-1) 的所有路径中,路径上所有数字异或值等于 k 的路径数。

关键点分析

  1. 路径定义
    • 每次可以向右或向下移动,因此路径会从 (0, 0)(m-1, n-1),只能通过这两种移动方式到达目标。
  2. 异或值
    • 对于路径上的所有数字 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ,路径的异或值是 a 1 ⊕ a 2 ⊕ ⋯ ⊕ a n a_1 \oplus a_2 \oplus \dots \oplus a_n a1a2an ,其中 ⊕ \oplus 表示按位异或操作。
  3. 目标
    • 找出满足异或值 =k 的路径数。
  4. 动态规划思路
    • 定义状态:dp[i][j][x] 表示从 (0, 0) 出发到达格子 (i, j) 且路径异或值为 x 的路径数。
    • 转移方程:可以从上方或左侧到达 (i, j),并更新路径异或值。
    • 初始化:起点 (0, 0) 的路径异或值为 grid[0][0],路径数为 1
    • 结果:返回 dp[m-1][n-1][k]
  5. 注意点
    • 路径数可能非常大,因此每次计算结果需要对 1 0 9 + 7 10^9 + 7 109+7 取模。
    • 为了处理路径异或值,使用哈希表存储当前异或值对应的路径数。

动态规划详细过程

1. 状态定义

dp[i][j][x] 表示从 (0, 0) 出发到达 (i, j) 且路径异或值为 x 的路径数。

2. 状态转移

对于每个格子 (i, j)

  1. 如果从上方 (i-1, j) 到达:
    • 异或值为 x,更新:dp[i][j][x ^ grid[i][j]] += dp[i-1][j][x]
  2. 如果从左侧 (i, j-1) 到达:
    • 异或值为 x,更新:dp[i][j][x ^ grid[i][j]] += dp[i][j-1][x]

最终状态需要对 1 0 9 + 7 10^9 + 7 109+7 取模。

3. 初始化
  • 起点 (0, 0) 的初始状态:dp[1][1][grid[0][0]] = 1
4. 结果
  • 返回右下角 (m-1, n-1) 的路径异或值为 k 的路径数,即:dp[m][n][k]

3、代码实现

class Solution {
public:
    const int mod = 1e9 + 7;

    int countPathsWithXorValue(vector<vector<int>>& grid, int k) {
        int row = grid.size();
        int col = grid[0].size();

        // 定义 dp 数组, dp[i][j] 是一个哈希表, 存储路径异或值及其路径数
        vector<vector<unordered_map<int, int>>> dp(row + 1, vector<unordered_map<int, int>>(col + 1));

        // 初始化起点
        dp[1][1][grid[0][0]] = 1;

        // 遍历每个格子
        for (int i = 1; i <= row; ++i) {
            for (int j = 1; j <= col; ++j) {
                // 当前格子值
                int currentVal = grid[i - 1][j - 1];

                // 从上方转移到当前格子
                for (const auto& kv : dp[i - 1][j]) {
                    int xorVal = kv.first ^ currentVal;
                    dp[i][j][xorVal] += kv.second;
                    dp[i][j][xorVal] %= mod;
                }

                // 从左侧转移到当前格子
                for (const auto& kv : dp[i][j - 1]) {
                    int xorVal = kv.first ^ currentVal;
                    dp[i][j][xorVal] += kv.second;
                    dp[i][j][xorVal] %= mod;
                }
            }
        }

        // 返回右下角格子中异或值为 k 的路径数
        return dp[row][col][k];
    }
};

在这里插入图片描述

4、复杂度分析

时间复杂度

  • 遍历每个格子 (i, j):O(m×n)。
  • 对于每个格子的哈希表操作,最坏情况是路径异或值的取值范围较大,复杂度为 O(X),其中 X 是最大可能的异或值范围(通常较小)。
  • 总时间复杂度为 O(m×n×X)。

空间复杂度

  • 每个格子存储一个哈希表,空间复杂度为 O(m×n×X)。

Q3、判断网格图能否被切割成块

1、题目描述

给你一个整数 n 表示一个 n x n 的网格图,坐标原点是这个网格图的左下角。同时给你一个二维坐标数组 rectangles ,其中 rectangles[i] 的格式为 [startx, starty, endx, endy] ,表示网格图中的一个矩形。每个矩形定义如下:

  • (startx, starty):矩形的左下角。
  • (endx, endy):矩形的右上角。

注意 ,矩形相互之间不会重叠。你的任务是判断是否能找到两条 要么都垂直要么都水平两条切割线 ,满足:

  • 切割得到的三个部分分别都 至少 包含一个矩形。
  • 每个矩形都 恰好仅 属于一个切割得到的部分。

如果可以得到这样的切割,请你返回 true ,否则返回 false

2、解题思路

1. 按照 x- 坐标和 y- 坐标分开处理

我们将矩形的范围分解为以下两类:

  • 水平维度:通过矩形的 x- 范围 [startx, endx]
  • 垂直维度:通过矩形的 y- 范围 [starty, endy]

通过分别在水平和垂直维度判断是否能形成至少 3 个独立区域,我们只要任一维度满足条件即可返回 true

2. 如何判断独立区域
  • 排序后贪心算法
    • 将所有矩形的范围按起点进行排序。
    • 遍历排序后的范围,用变量 right 跟踪当前范围的右边界。
    • 当遇到一个新的范围起点大于 right 时,说明该范围与之前的区域不重叠,可以算作一个新的独立区域。
    • 每次增加一个独立区域计数器 num,当 num >= 3 时即可返回 true
3. 处理步骤
  • 构造两个范围数组:
    • v1:存储所有矩形的水平范围 [startx, endx]
    • v2:存储所有矩形的垂直范围 [starty, endy]
  • 分别对 v1 和 v2 进行独立区域计数,任意一个维度满足条件即可。
4. 类似题目 – 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        if (n == 0) {
            return {};
        }

        sort(intervals.begin(), intervals.end());
        vector<vector<int>> ret;

        for (int i = 0; i < n; i++) {
            int left = intervals[i][0], right = intervals[i][1];
            if (ret.empty() || ret.back()[1] < left) {
                ret.push_back({left, right});
            } else {
                ret.back()[1] = max(ret.back()[1], right);
            }
        }

        return ret;
    }
};

根据这一题的答案,我们可以仿写一下这一题的答案:

class Solution {
public:
    bool checkValidCuts(int n, vector<vector<int>>& rectangles) {
        vector<vector<int>> v1, v2;
        for (const auto& rect : rectangles) {
            v1.push_back({rect[0], rect[2]});
            v2.push_back({rect[1], rect[3]});
        }

        sort(v1.begin(), v1.end());
        vector<vector<int>> ret1;

        for (int i = 0; i < v1.size(); i++) {
            int left = v1[i][0], right = v1[i][1];
            if (ret1.empty() || ret1.back()[1] <= left) {
                ret1.push_back({left, right});
            } else {
                ret1.back()[1] = max(ret1.back()[1], right);
            }
            if (ret1.size() >= 3) {
                return true;
            }
        }

        sort(v2.begin(), v2.end());
        vector<vector<int>> ret2;

        for (int i = 0; i < v2.size(); i++) {
            int left = v2[i][0], right = v2[i][1];
            if (ret2.empty() || ret2.back()[1] <= left) {
                ret2.push_back({left, right});
            } else {
                ret2.back()[1] = max(ret2.back()[1], right);
            }
            if (ret2.size() >= 3) {
                return true;
            }
        }

        return false;
    }
};

但是实际上这一题我们只需要知道能不能被切割就行了,并不在乎切割后的区间情况,因此可以进一步优化。见下。

3、代码实现

class Solution {
public:
    bool checkValidCuts(int n, vector<vector<int>>& rectangles) {
        // 存储水平和垂直范围
        vector<vector<int>> v1, v2;

        // 存储矩形的范围
        for (const auto& rect : rectangles) {
            v1.push_back({rect[0], rect[2]}); // 水平范围
            v2.push_back({rect[1], rect[3]}); // 垂直范围
        }

        // 排序水平范围
        sort(v1.begin(), v1.end());
        int num = 0;    // 独立区域计数
        int right = -1; // 当前右边界

        // 贪心统计独立区域
        for (const auto& v : v1) {
            // 新的独立区域
            if (v[0] >= right) {
                num++;
                // 剪枝: 找到 3 个独立区域, 立马结束
                if (num >= 3) {
                    return true;
                }
            }
            right = max(right, v[1]); // 更新右边界
        }

        // 排序垂直范围
        sort(v2.begin(), v2.end());
        num = 0;    // 重置计数
        right = -1; // 重置右边界

        // 贪心统计独立区域
        for (const auto& v : v2) {
            // 新的独立区域
            if (v[0] >= right) {
                num++;
                // 剪枝: 找到 3 个独立区域, 立马结束
                if (num >= 3) {
                    return true;
                }
            }
            right = max(right, v[1]); // 更新右边界
        }

        return false; // 无法找到符合条件的切割
    }
};

在这里插入图片描述

4、复杂度分析

时间复杂度

  • 构造 v1 和 v2:O(m),其中 m 是矩形数量。
  • 排序 v1 和 v2:O(mlog⁡m)。
  • 贪心遍历 v1 和 v2:O(m)。
  • 总时间复杂度为 O(mlog⁡m)。

空间复杂度

  • 额外存储 v1 和 v2:O(m)。
  • 总空间复杂度为 O(m)。

Q4、唯一中间众数子序列 Ⅰ

1、题目描述

给你一个整数数组 nums ,请你求出 nums 中大小为 5 的子序列的数目,它是 唯一中间众数序列

由于答案可能很大,请你将答案对 109 + 7 取余 后返回。

众数 指的是一个数字序列中出现次数 最多 的元素。

如果一个数字序列众数只有一个,我们称这个序列有 唯一众数

一个大小为 5 的数字序列 seq ,如果它中间的数字(seq[2])是唯一众数,那么称它是 唯一中间众数 序列。

子序列 指的是将一个数组删除一些(也可以不删除)元素后,剩下元素不改变顺序得到的 非空 数组。

2、解题思路

问题分解

  1. 子序列的定义
    • 子序列可以通过删除原数组中的若干元素(不改变顺序)得到。
    • 因此,对于大小为 n 的数组,总共有 C(n, 5) 个大小为 5 的子序列。
  2. 唯一中间众数的定义
    • 中间元素必须是子序列的众数,且是唯一众数。
    • 为了满足条件,子序列两边的元素不能包含比中间元素更多的重复值。
  3. 结果计算
    • 我们需要计算所有大小为 5 的子序列总数,然后减去不合法的子序列数。

解题思路

  1. 总数计算
    • 总共有 C ( n , 5 ) = n ⋅ ( n − 1 ) ⋅ ( n − 2 ) ⋅ ( n − 3 ) ⋅ ( n − 4 ) 120 C(n, 5) = \frac{n \cdot (n-1) \cdot (n-2) \cdot (n-3) \cdot (n-4)}{120} C(n,5)=120n(n1)(n2)(n3)(n4) 个大小为 5 的子序列。
  2. 不合法子序列的分类
    • 仅有一个中间元素:两边元素不足以形成有效的众数。
    • 有两个中间元素
      • 左右两边元素分布不均,导致中间元素不是唯一众数。
  3. 具体实现
    • 使用前缀计数 preCount 和后缀计数 sufCount,分别记录当前中间元素左右两侧的元素分布。
    • 遍历每个元素作为潜在的中间元素,动态计算不合法方案数。

3、代码实现

class Solution {
    // 计算组合数 C(n, 2)
    int comb2(int num) { return num * (num - 1) / 2; }

public:
    int subsequencesWithMiddleMode(vector<int>& nums) {
        int n = nums.size();
        const int MOD = 1'000'000'007;

        // 所有子序列的总数 (长度为 5 的组合)
        long long totalSubsequences = 1LL * n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 120;

        // 用于记录元素的出现次数
        unordered_map<int, int> preCount, sufCount;
        for (int x : nums) {
            sufCount[x]++;
        }

        // 用于计算不合法方案
        auto calculateInvalidSequences = [&](int x, int left, int right) -> long long {
            long long invalidCount = 0;
            int pre_x = preCount[x], suf_x = sufCount[x];

            // 1. 不合法: 只有一个 x
            invalidCount += 1LL * comb2(left - pre_x) * comb2(right - suf_x);

            // 2. 不合法: 只有两个 x, 且至少有两个 y (y != x)
            for (const auto& [y, suf_y] : sufCount) {
                if (y == x) {
                    continue;
                }

                int pre_y = preCount[y];

                // a) 左边两个 y, 右边一个 x
                invalidCount += 1LL * comb2(pre_y) * suf_x * (right - suf_x);

                // b) 右边两个 y, 左边一个 x
                invalidCount += 1LL * comb2(suf_y) * pre_x * (left - pre_x);

                // c) 左右各一个 y, 另一个 x 在左边
                invalidCount += 1LL * pre_y * suf_y * pre_x * (right - suf_x - suf_y);

                // d) 左右各一个 y,另一个 x 在右边
                invalidCount += 1LL * pre_y * suf_y * suf_x * (left - pre_x - pre_y);
            }

            return invalidCount;
        };

        long long validSubsequences = totalSubsequences;

        // 枚举每个可能的正中间元素 x
        for (int left = 0; left < n - 2; left++) {
            int x = nums[left];
            sufCount[x]--;

            if (left > 1) {
                int right = n - 1 - left;
                validSubsequences -= calculateInvalidSequences(x, left, right);
            }

            preCount[x]++;
        }

        return validSubsequences % MOD;
    }
};

在这里插入图片描述

4、复杂度分析

时间复杂度 O ( n 2 ) O(n^2) O(n2)

  • 外层遍历所有元素作为中间值 x,复杂度 O ( n ) O(n) O(n)
  • 内层统计不合法方案,复杂度与不同元素个数 k 成正比,最坏情况下 k = n 。

空间复杂度 O ( n ) O(n) O(n)

  • 主要用于存储 preCountsufCount


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

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

相关文章

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

铝电解电容使用寿命

铝电解电容寿命问题 铝电解电容为什么会失效&#xff1f;铝电解电容失效与那些因素有关&#xff1f;电解电容寿命如何计算&#xff1f; 1铝电解电容为什么会失效&#xff1f; 电容都是由两个导电板并排放到一起就构成了。正极是铝&#xff08;阳极箔&#xff09;&#xff0c;…

用Python PySide6 复刻了两软件UI 做下练习

图样 1 代码 1&#xff1a; # -*- coding: utf-8 -*-import sys from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, QDate) from PySide6.QtGui import QIcon, QPixmap, QColor from PySide6.QtWidgets import (QApplication, QDialog, QLineEdit, QPushBut…

安装MongoDB,环境配置

官网下载地址&#xff1a;MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成&#xff1a;分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

重温设计模式--职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&a…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为&#xff0c;深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题&#xff0c;并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导&#xff0c;助力考生科学合理地填报高考志愿&#xff0c;避免陷入各…

如何查看vivado项目所使用的版本

在我们提供的各类教程中vivado使用的版本都不同&#xff0c;而使用不同版本的vivado打开项目时可能会产生一些其它错误&#xff0c;所有最好使用对应的vivado版本打开&#xff0c;本例主要演示如何查看项目所示使用的vivado版本。 如下图所示&#xff0c;为vivado2023.1版本创建…

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结&#xff1a; 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框&#xff0c;使用加减乘除 4.1 表面采样器 …

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理&#xff1a;不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如&#xff0c;氮元素是植物叶绿素的重要组成部分&#xff0c;植物缺氮时&#xff0c;叶绿素含量下降&#xff0c;其在可见光波段&a…

基于Springboot的数字科技风险报告管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

14,攻防世界Web_php_unserialize

进入场景 看见代码&#xff0c;解析一下 这段PHP代码定义了一个名为Demo的类&#xff0c;并演示了如何通过URL参数进行反序列化和文件高亮显示的功能&#xff0c;同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释&#xff1a; 1.<php 开始PHP代码…

基于NodeMCU的物联网窗帘控制系统设计

最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;仿智能家居&#xff09;”项目中的“家电控制设计”中的“窗帘控制”子项目&#xff0c;最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…

【Linux开发工具】自动化构建-make/Makefile

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux开发工具】gcc和g &#x1f516;流水不争&#xff0c;争的是滔滔不 一、make和Makefile简介1.1 什么是…

Elasticsearch安装和数据迁移

Elasticsearch安装和数据迁移 Elasticsearch安装 下载并解压Elasticsearch 首先下载Elasticsearch的tar.gz文件&#xff0c;并将其解压&#xff1a; wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.2-linux-x86_64.tar.gz tar -xzf elastics…

dockerfile文档编写(1):基础命令

目录 Modelscope-agentARGFROMWORKDIRCOPYRUNENVCMD run_loopy Modelscope-agent ARG BASE_IMAGEregistry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.1.2-tf2.14.0-1.12.0FROM $BASE_IMAGEWORKDIR /home/workspaceCOPY . /hom…

【论文阅读笔记】Learning to sample

Learning to sample 前沿引言方法问题声明S-NET匹配ProgressiveNet: sampling as ordering 实验分类检索重建 结论附录 前沿 这是一篇比较经典的基于深度学习的点云下采样方法 核心创新点&#xff1a; 首次提出了一种学习驱动的、任务特定的点云采样方法引入了两种采样网络&…

置换密码程序设计

实验目的与要求 1. 帮助学生掌握置换密码的加密解密过程&#xff0c;能够利用所学过的编程语言&#xff0c;实现加解密算法。使学生掌握编程实现实际问题中的方法&#xff0c;提高专业技能和专业素养。 2. 要求学生掌握算法的程序实现的方法,能应用密码算法的特点&#xff0c…

Android修行手册 - 移动端几种常用动画方案对比

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…