力扣第452场周赛

完整内、外期货量化交易系统源码可售 支持客户登录校验,支持所有的实时行情和汇总报价功能、实时资讯(报价,列表,分时,分钟成交明晰,),多线程支持盘后收盘作业下载(日线,5分钟线,15分钟, 30分钟,60分钟线,),支持从服务器下载相关运行配置(来自服务器动态配置信息,如收盘日期等),实现状态条显示。收盘作业包括日线、5分钟线、15分钟线、30分钟、60分钟线、2小时线、4小时线每日分时走势。综合信息栏显示用户账户信息、合约信息、当日委托单记录、当日成交记录、当日平仓记录、当日跟单记录、当日(月/周)排行榜、下单栏、持仓信息; 阅读详情

Q1. 等积子集的划分方案

给你一个整数数组 nums,其中包含的正整数 互不相同 ,另给你一个整数 target。

请判断是否可以将 nums 分成两个 非空、互不相交 的 子集 ,并且每个元素必须  恰好 属于 一个 子集,使得这两个子集中元素的乘积都等于 target。

如果存在这样的划分,返回 true;否则,返回 false。

子集 是数组中元素的一个选择集合。

示例 1:

输入: nums = [3,1,6,8,4], target = 24

输出: true

解释:子集 [3, 8] 和 [1, 6, 4] 的乘积均为 24。因此,输出为 true 。

示例 2:

输入: nums = [2,5,3,7], target = 15

输出: false

解释:无法将 nums 划分为两个非空的互不相交子集,使得它们的乘积均为 15。因此,输出为 false。

提示:

3 <= nums.length <= 12
1 <= target <= 10^15
1 <= nums[i] <= 100
nums 中的所有元素互不相同。

    解题思路:枚举所有可能的子集合 

    class Solution {
    public:
        bool checkEqualPartitions(vector<int>& nums, long long t) {
            int n=nums.size();
            for(int i=1;i<(1<<n);i++){
                long long a0=1,a1=1;
                for(int j=0;j<n;j++){
                    if(i>>j&1) a0*=nums[j];
                    else a1*=nums[j];
                    if(a0>t||a1>t) break;
                }
                if(a0==t&&a1==t) return true;
            }
            return false;
        }
    };
    // C 5_1+ C 5_2 + C 5_3 + C 5_4 = 2^n-1

     Q2. 子矩阵的最小绝对差

    给你一个 m x n 的整数矩阵 grid 和一个整数 k。

    对于矩阵 grid 中的每个连续的 k x k 子矩阵,计算其中任意两个 不同值 之间的 最小绝对差 。

    返回一个大小为 (m - k + 1) x (n - k + 1) 的二维数组 ans,其中 ans[i][j] 表示以 grid 中坐标 (i, j) 为左上角的子矩阵的最小绝对差。

    注意:如果子矩阵中的所有元素都相同,则答案为 0。

    子矩阵 (x1, y1, x2, y2) 是一个由选择矩阵中所有满足 x1 <= x <= x2 且 y1 <= y <= y2 的单元格 matrix[x][y] 组成的矩阵。

    示例 1:

    输入: grid = [[1,8],[3,-2]], k = 2

    输出: [[2]]

    解释:

    只有一个可能的 k x k 子矩阵:[[1, 8], [3, -2]]。
    子矩阵中的不同值为 [1, 8, 3, -2]。
    子矩阵中的最小绝对差为 |1 - 3| = 2。因此,答案为 [[2]]。
    示例 2:

    输入: grid = [[3,-1]], k = 1

    输出: [[0,0]]

    解释:

    每个 k x k 子矩阵中只有一个不同的元素。
    因此,答案为 [[0, 0]]。
    示例 3:

    输入: grid = [[1,-2,3],[2,3,5]], k = 2

    输出: [[1,2]]

    解释:

    有两个可能的 k × k 子矩阵:
    以 (0, 0) 为起点的子矩阵:[[1, -2], [2, 3]]。
    子矩阵中的不同值为 [1, -2, 2, 3]。
    子矩阵中的最小绝对差为 |1 - 2| = 1。
    以 (0, 1) 为起点的子矩阵:[[-2, 3], [3, 5]]。
    子矩阵中的不同值为 [-2, 3, 5]。
    子矩阵中的最小绝对差为 |3 - 5| = 2。
    因此,答案为 [[1, 2]]。


    提示:

    1 <= m == grid.length <= 30
    1 <= n == grid[i].length <= 30
    -105 <= grid[i][j] <= 105
    1 <= k <= min(m, n)

    解题思路:直接枚举所有的子矩阵即可, 将子矩阵中的元素进行排序+去重, 求元素的相邻最小差值, 类似于今年某桥杯中的那个平滑度, 时间复杂度是(n-k)*(m-k)*k^2, (m 和 n都很小)

    class Solution {
    public:
        vector<vector<int>> minAbsDiff(vector<vector<int>>& grid, int k) {
            int m=grid.size(), n=grid[0].size();
            vector<vector<int>> ans; ans.resize(m-k+1,vector<int>(n-k+1,0));
            for(int i=0;i<=m-k;i++){
                for(int j=0;j<=n-k;j++){
                    vector<int> a;
                    for(int x=0;x<k;x++){
                        for(int y=0;y<k;y++){
                            a.push_back(grid[i+x][j+y]);
                        }
                    }
                    sort(a.begin(),a.end());
                    a.erase(unique(a.begin(),a.end()),a.end());
                    int min_diff=INT_MAX;
                    for(int i=1;i<a.size();i++){
                        min_diff=min(min_diff,abs(a[i]-a[i-1]));
                    }
                    ans[i][j]=a.size()==1?0:min_diff;
                }
            }
            return ans;
        }
    };
    
    // 1 -2 3
    // 2 3  5

     Q3. 清理教室的最少移动

     给你一个 m x n 的网格图 classroom,其中一个学生志愿者负责清理散布在教室里的垃圾。网格图中的每个单元格是以下字符之一:
    'S' :学生的起始位置
    'L' :必须收集的垃圾(收集后,该单元格变为空白)
    'R' :重置区域,可以将学生的能量恢复到最大值,无论学生当前的能量是多少(可以多次使用)
    'X' :学生无法通过的障碍物
    '.' :空白空间
    同时给你一个整数 energy,表示学生的最大能量容量。学生从起始位置 'S' 开始,带着 energy 的能量出发。

    每次移动到相邻的单元格(上、下、左或右)会消耗 1 单位能量。如果能量为 0,学生此时只有处在 'R' 格子时可以继续移动,此区域会将能量恢复到 最大 能量值 energy。

    返回收集所有垃圾所需的 最少 移动次数,如果无法完成,返回 -1。

    示例 1:

    输入: classroom = ["S.", "XL"], energy = 2

    输出: 2

    解释:

    学生从单元格 (0, 0) 开始,带着 2 单位的能量。
    由于单元格 (1, 0) 有一个障碍物 'X',学生无法直接向下移动。
    收集所有垃圾的有效移动序列如下:
    移动 1:从 (0, 0) → (0, 1),消耗 1 单位能量,剩余 1 单位。
    移动 2:从 (0, 1) → (1, 1),收集垃圾 'L'。
    学生通过 2 次移动收集了所有垃圾。因此,输出为 2。
    示例 2:

    输入: classroom = ["LS", "RL"], energy = 4

    输出: 3

    解释:

    学生从单元格 (0, 1) 开始,带着 4 单位的能量。
    收集所有垃圾的有效移动序列如下:
    移动 1:从 (0, 1) → (0, 0),收集第一个垃圾 'L',消耗 1 单位能量,剩余 3 单位。
    移动 2:从 (0, 0) → (1, 0),到达 'R' 重置区域,恢复能量为 4。
    移动 3:从 (1, 0) → (1, 1),收集第二个垃圾 'L'。
    学生通过 3 次移动收集了所有垃圾。因此,输出是 3。
    示例 3:

    输入: classroom = ["L.S", "RXL"], energy = 3

    输出: -1

    解释:

    没有有效路径可以收集所有 'L'。

    提示:

    1 <= m == classroom.length <= 20
    1 <= n == classroom[i].length <= 20
    classroom[i][j] 是 'S'、'L'、'R'、'X' 或 '.' 之一
    1 <= energy <= 50
    网格图中恰好有 一个 'S'。
    网格图中 最多 有 10 个 'L' 单元格。

      解题思路: 用BFS 求出 a[i][j][w][k]: 表示位于(i,j), 还有w的能量, 捡垃圾的情况是 k 所需的最小步数(给每个垃圾一个 0-9 的编号),用一个二进制 k 表示哪些垃圾已经捡过了), 注意有个重要的剪枝 ,如果这个 (x,y,new_k) 状态 已在更高能量访问过,就不必用较低能量访问,避免重复搜索。

      class Solution {
      public:
          const int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};   
          int minMoves(vector<string>& a, int energy) {
              int m=a.size(),n=a[0].size();
      
              int r_cnt=0;
              int s_i=0,s_j=0;
              vector<vector<int>> f(m,vector<int>(n,-1));
              for(int i=0;i<m;i++){
                  for(int j=0;j<n;j++){
                      if(a[i][j]=='L'){
                          f[i][j]=r_cnt++;
                      }else if(a[i][j]=='S'){
                          s_i=i,s_j=j;
                      }
                  }
              }
              vector<vector<vector<vector<int>>>> b(m, vector<vector<vector<int>>>(n, vector<vector<int>>(energy+1,vector<int>(1<<r_cnt,-1))));
              queue<tuple<int,int,int,int>> q;
              b[s_i][s_j][energy][0]=0;
              q.push({s_i,s_j,energy,0});
              while(!q.empty()){
                  auto [i,j,w,k]=q.front(); q.pop();
                  int s=b[i][j][w][k];
                  for(int t=0;t<4;t++){
                      int x=i+d[t][0],y=j+d[t][1];
                      if(x<0||y<0||x>=m||y>=n) continue;
                      if(a[x][y]=='X') continue;
                      if(w==0&&a[i][j]!='R') continue;
                      int new_w=(a[x][y]=='R'?energy:w-1);
                      int new_k=k;
                      if(a[x][y]=='L'&&f[x][y]!=-1){
                          new_k|=(1<<f[x][y]);
                      }
                      bool z=true;
                      for(int e=new_w+1;e<=energy;e++){
                          if(b[x][y][e][new_k]!=-1){
                              z=false;
                              break;
                          }
                      }
                      if(z&&b[x][y][new_w][new_k]==-1){
                          b[x][y][new_w][new_k]=s+1;
                          q.push({x,y,new_w,new_k});
                      }
                  }
              }
              int res=-1;
              for(int i=0;i<m;i++){
                  for(int j=0;j<n;j++){
                      for(int w=0;w<=energy;w++){
                          if(b[i][j][w][(1<<r_cnt)-1]!=-1){
                              res=(res==-1?b[i][j][w][(1<<r_cnt)-1]:min(res,b[i][j][w][(1<<r_cnt)-1]));
                          }
                      }
                  }
              }
              return res;
          }
      };

      Q4. 分割数组后不同质数的最大数目

      给你一个长度为 'n' 的整数数组 nums,以及一个二维整数数组 queries,其中 queries[i] = [idx, val]。
      对于每个查询:

      更新 nums[idx] = val。
      选择一个满足 1 <= k < n 的整数 k ,将数组分为非空前缀 nums[0..k-1] 和后缀 nums[k..n-1],使得每部分中 不同 质数的数量之和 最大 。
      注意:每次查询对数组的更改将持续到后续的查询中。

      返回一个数组,包含每个查询的结果,按给定的顺序排列。

      质数是大于 1 的自然数,只有 1 和它本身两个因数。

      示例 1:

      输入: nums = [2,1,3,1,2], queries = [[1,2],[3,3]]

      输出: [3,4]

      解释:

      初始时 nums = [2, 1, 3, 1, 2]。
      在第一次查询后,nums = [2, 2, 3, 1, 2]。将 nums 分为 [2] 和 [2, 3, 1, 2]。[2] 包含 1 个不同的质数,[2, 3, 1, 2] 包含 2 个不同的质数。所以此查询的答案是 1 + 2 = 3。
      在第二次查询后,nums = [2, 2, 3, 3, 2]。将 nums 分为 [2, 2, 3] 和 [3, 2],其答案为 2 + 2 = 4。
      最终输出为 [3, 4]。
      示例 2:

      输入: nums = [2,1,4], queries = [[0,1]]

      输出: [0]

      解释:

      初始时 nums = [2, 1, 4]。
      在第一次查询后,nums = [1, 1, 4]。此时数组中没有质数,因此此查询的答案为 0。
      最终输出为 [0]。


      提示:

      2 <= n == nums.length <= 5 * 10^4
      1 <= queries.length <= 5 * 10^4
      1 <= nums[i] <= 10^5
      0 <= queries[i][0] < nums.length
      1 <= queries[i][1] <= 10^5

      解题思路: 题意是将原数组进行分割成一个非空前缀和一个非空后缀数组, 其实就是枚举数组的空隙,然后就是统计前缀和后缀中不同质数的总和,统计的时候, 我们可以在原质数总和的基础上, 去计算一个最大的增量

      区间+1 && 区间求最大者 => lazy 线段树

      题目中有个query 会修改数组中的值, 此时线段树中区间质数相同值就会发生变化, 所以我们要把一个子区间等于left 和 right 的相同值都维护起来,

      eg: unordered_map<int,set<int>>;

      key: 质数 value: 这个质数的下标的有序集合

       

      const int MX = 100'000;
      bool np[MX + 1];
      
      int init = []() {
          np[0] = np[1] = true;
          for (int i = 2; i <= MX; i++) {
              if (!np[i]) {
                  for (int j = i; j <= MX / i; j++) { // 避免溢出的写法
                      np[i * j] = true;
                  }
              }
          }
          return 0;
      }();
      
      template<typename T, typename F>
      class LazySegmentTree {
          // 注:也可以去掉 template<typename T, typename F>,改在这里定义 T 和 F
          // using T = pair<int, int>;
          // using F = pair<int, int>;
      
          // 懒标记初始值
          const F TODO_INIT = 0;
      
          struct Node {
              T val;
              F todo;
          };
      
          int n;
          vector<Node> tree;
      
          // 合并两个 val
          T merge_val(T a, T b) const {
              return max(a, b);
          }
      
          // 合并两个懒标记
          F merge_todo(F a, F b) const {
              return a + b;
          }
      
          // 把懒标记作用到 node 子树(本例为区间加)
          void apply(int node, int l, int r, F todo) {
              Node& cur = tree[node];
              // 计算 tree[node] 区间的整体变化
              cur.val += todo;
              cur.todo = merge_todo(todo, cur.todo);
          }
      
          // 把当前节点的懒标记下传给左右儿子
          void spread(int node, int l, int r) {
              Node& cur = tree[node];
              F todo = cur.todo;
              if (todo == TODO_INIT) { // 没有需要下传的信息
                  return;
              }
              int m = (l + r) / 2;
              apply(node * 2, l, m, todo);
              apply(node * 2 + 1, m + 1, r, todo);
              cur.todo = TODO_INIT; // 下传完毕
          }
      
          // 合并左右儿子的 val 到当前节点的 val
          void maintain(int node) {
              tree[node].val = merge_val(tree[node * 2].val, tree[node * 2 + 1].val);
          }
      
          // 用 a 初始化线段树
          // 时间复杂度 O(n)
          void build(const vector<T>& a, int node, int l, int r) {
              Node& cur = tree[node];
              cur.todo = TODO_INIT;
              if (l == r) { // 叶子
                  cur.val = a[l]; // 初始化叶节点的值
                  return;
              }
              int m = (l + r) / 2;
              build(a, node * 2, l, m); // 初始化左子树
              build(a, node * 2 + 1, m + 1, r); // 初始化右子树
              maintain(node);
          }
      
          void update(int node, int l, int r, int ql, int qr, F f) {
              if (ql <= l && r <= qr) { // 当前子树完全在 [ql, qr] 内
                  apply(node, l, r, f);
                  return;
              }
              spread(node, l, r);
              int m = (l + r) / 2;
              if (ql <= m) { // 更新左子树
                  update(node * 2, l, m, ql, qr, f);
              }
              if (qr > m) { // 更新右子树
                  update(node * 2 + 1, m + 1, r, ql, qr, f);
              }
              maintain(node);
          }
      
          T query(int node, int l, int r, int ql, int qr) {
              if (ql <= l && r <= qr) { // 当前子树完全在 [ql, qr] 内
                  return tree[node].val;
              }
              spread(node, l, r);
              int m = (l + r) / 2;
              if (qr <= m) { // [ql, qr] 在左子树
                  return query(node * 2, l, m, ql, qr);
              }
              if (ql > m) { // [ql, qr] 在右子树
                  return query(node * 2 + 1, m + 1, r, ql, qr);
              }
              T l_res = query(node * 2, l, m, ql, qr);
              T r_res = query(node * 2 + 1, m + 1, r, ql, qr);
              return merge_val(l_res, r_res);
          }
      
      public:
          // 线段树维护一个长为 n 的数组(下标从 0 到 n-1),元素初始值为 init_val
          LazySegmentTree(int n, T init_val = 0) : LazySegmentTree(vector<T>(n, init_val)) {}
      
          // 线段树维护数组 a
          LazySegmentTree(const vector<T>& a) : n(a.size()), tree(2 << bit_width(a.size() - 1)) {
              build(a, 1, 0, n - 1);
          }
      
          // 用 f 更新 [ql, qr] 中的每个 a[i]
          // 0 <= ql <= qr <= n-1
          // 时间复杂度 O(log n)
          void update(int ql, int qr, F f) {
              update(1, 0, n - 1, ql, qr, f);
          }
      
          // 返回用 merge_val 合并所有 a[i] 的计算结果,其中 i 在闭区间 [ql, qr] 中
          // 0 <= ql <= qr <= n-1
          // 时间复杂度 O(log n)
          T query(int ql, int qr) {
              return query(1, 0, n - 1, ql, qr);
          }
      };
      
      class Solution {
      public:
          vector<int> maximumCount(vector<int>& nums, vector<vector<int>>& queries) {
              int n = nums.size();
              unordered_map<int, set<int>> pos;
              for (int i = 0; i < n; i++) {
                  int x = nums[i];
                  if (!np[x]) {
                      pos[x].insert(i);
                  }
              }
      
              LazySegmentTree<int, int> t(n);
              for (auto& [_, s] : pos) {
                  if (s.size() > 1) {
                      t.update(*s.begin(), *s.rbegin(), 1);
                  }
              }
      
              vector<int> ans;
              for (auto& q : queries) {
                  int i = q[0], v = q[1];
                  int old = nums[i];
                  nums[i] = v;
      
                  // 处理旧值
                  if (!np[old]) {
                      auto& s = pos[old];
                      if (s.size() > 1) {
                          t.update(*s.begin(), *s.rbegin(), -1); // 撤销之前的区间 +1
                      }
                      s.erase(i);
                      if (s.size() > 1) {
                          t.update(*s.begin(), *s.rbegin(), 1); // 新的区间 +1
                      } else if (s.empty()) {
                          pos.erase(old);
                      }
                  }
      
                  // 处理新值
                  if (!np[v]) {
                      auto& s = pos[v];
                      if (s.size() > 1) {
                          t.update(*s.begin(), *s.rbegin(), -1); // 撤销之前的区间 +1
                      }
                      s.insert(i);
                      if (s.size() > 1) {
                          t.update(*s.begin(), *s.rbegin(), 1); // 新的区间 +1
                      }
                  }
      
                  // 整个数组的不同质数个数 + 切一刀的最大额外收益
                  ans.push_back(pos.size() + t.query(0, n - 1));
              }
      
              return ans;
          }
      };

      感觉牛客最后一题喜欢出组合数的问题, 力扣更偏向于线段树

      想追求AK的同学可以重点突破一下, 线段树的板子可以去我基础算法那栏找一下

      感谢大家的点赞和关注,你们的支持是我创作的动力! 

       

      世界职业院校技能大赛财经赛道项目参考逐字稿五 阅读详情

      相关推荐

      S32K1XX调试--快速定位HardFault

      1、背景 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。 2、分析 要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。 根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了 根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。 3、问题查找 提供一种不需要懂汇编指令的查找方法,方法如下: 在中断处理函数中插入以下代码,以及另外定义

      ping_devil的博客 4018

      LeetCode第452场周赛复盘,位运算常见用法介绍

      LeetCode上解决等积子集的划分方案"问题的两种解法:一种是基于深度优先搜索(DFS)的递归实现,另一种是学习后改进的二进制枚举算法。接着详细介绍了Java位运算的基础操作(与、或、异或、取反等)及其区别,重点讲解了>>和>>>运算符的不同特性。最后整理了一系列实用位运算技巧,包括判断奇偶、快速乘除、变量交换、位操作等实际应用场景,为算法优化提供了底层运算支持。全文结合代码示例,从具体算法问题延伸到基础位运算知识,具有较强实用性。

      m0_74871188的博客 379

      实战STM32G0驱动DRV8870/AT8870:PWM+DMA精准调速与H桥衰减模式详解

      本文详细介绍了如何使用STM32G0单片机结合DRV8870/AT8870电机驱动芯片实现直流有刷电机的精准控制。重点讲解了PWM与DMA结合实现高效调速的硬件配置与软件驱动方法,并深入剖析了H桥快衰减与慢衰减模式的工作原理及应用场景,为嵌入式电机控制项目提供了完整的实战解决方案。

      c7d8e9的博客 595

      [leetcode] 452周赛

      class NumArray { private: vector<int> prefix; public: NumArray(vector<int>& nums) { int n=nums.size(); prefix.resize(n+1,0); for(int i=1;i<=n;++i) prefix[i]=prefix[i-1]+nums[i-1]; } int sumRange(int left, int ri

      No Game No Life 620

      Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

      好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

      u013250861的博客 218

      YOLOv12中的A2C2f模块详解,涉及区域注意力模块(A2)和 R-ELAN 结构详解

      区域注意力模块(Area Attention, A2)的设计出发点是为了解决传统注意力机制在计算复杂度和内存访问效率上的问题。传统的自注意力机制(Self-Attention)具有二次方的计算复杂度(O(n²)),尤其是在处理高分辨率图像时,计算成本非常高。此外,注意力机制的内存访问模式不如卷积神经网络高效,导致在实际应用中难以满足实时性要求。区域注意力模块通过将特征图划分为多个区域,并在每个区域内进行注意力计算,从而显著降低了计算复杂度。

      Limiiiing的博客 5513

      历次周赛、专场竞赛、春秋赛题目场次及对应具体题目题号+链接汇总

      Warm Up Contest: 386.字典序排数 387.字符串中的第一个唯一字符 388.文件的最长绝对路径 Weekly Contest 2: 389. 找不同 390. 消除游戏 391. 完美矩形 Weekly Contest 3: 392. 判断子序列 393. UTF-8 编码验证 394. 字符串解码 395. 至少有 K 个重复字符的最长子串 Weekly Contest 4: 396. 旋转函数 397. 整数替换 398. 随机数索引 399. 除法求值 Weekly Contest

      zhuruihe2014的博客 5313

      Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

      Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

      LuciferLiu_DBA 2190

      评分到底准不准?leetcode_problem_rating数据范围、精度局限与每周更新机制完整说明

      **leetcode_problem_rating** 是一个 LeetCode 竞赛题评分查询项目,它基于 Elo 评分系统自算每周赛/双周赛题目的难度分数,并提供一个支持关键词、竞赛编号、分数区间筛选的可视化查询页面。本文完整说明它的数据覆盖范围、精度局限与每周更新机制,帮你判断这套评分到底"准不准"、能怎么用。 --- ## 一、评分是怎么算出来的:Elo 机制 1 分钟看懂 📐 项

      gitblog_00087的博客 390

      针对小缺陷目标:在YOLOv11中引入小目标检测层

      摘要: 针对YOLOv11在工业检测中漏检微小目标(如焊点气泡)的问题,研究发现深层特征下采样导致小目标信息丢失。通过在YOLOv11中增加P2检测层(4倍下采样)并融合浅层高分辨率特征,可显著提升小目标召回率。关键优化包括:调整模型结构、谨慎设计数据增强策略(减少MixUp、增加小目标粘贴)、重新分配损失权重(提升P2层权重)、优化推理速度(动态分辨率、通道裁剪)。同时强调数据质量的重要性,建议根据具体场景特性(目标尺寸、分布)定制方案,而非盲目调整模型。

      as1225120794的博客 366

      080、多轴运动控制:插补器设计(螺旋线插补)

      本文分享了螺旋线插补器设计的实战经验。针对五轴点胶机Z轴抖动问题,作者分析了螺旋线数学本质,提出基于归一化时间参数的速度规划方法,强调各轴严格同步的重要性。文章详细介绍了速度分解、加减速处理、嵌入式优化技巧(查表法、定点化),并总结了起点闭合、速度波动、数值处理等常见问题解决方案。最后给出5条实用建议:注重速度规划而非纯数学推导、预先仿真、保留调试接口、考虑机械谐振、防范编码器丢脉冲。通过优化插补周期、电子齿轮比和S形速度曲线,成功将设备良率从60%提升至95%。

      m0_50546716的博客 84

      BFS-拆点

      对每个点拆成四个状态:横坐标、纵坐标、剩余能量、还剩多少垃圾没处理的集合。

      weixin_72963754的博客 202

      ICC2: 如何让CTS指定pin多长指定长度

      这里create_clock不需要写到sdc里,在脚本里写就行,需要注意的是脚本里存在remove_clock_tree的话,add_buffer就要放remove_clock_tree后面,或者给guide buffer设don't touch也行。跟innovus的操作逻辑一样,如果要让tree上的某一点长长,要先考虑这个点后面的clock tree能正常balance。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?-5意味着长长5ns,相反正值意味着做短。

      m0_61544122的博客 679

      LeetCode Hot 100 二叉树专题(二)3 题(Java)

      本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

      2401_88612756的博客 352

      计算机控制技术及应用

      《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

      efm32 入门.pdf

      本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

      LeetCode Hot 100 链表专题 三· 3 题(Java)

      收录题目:2. 两数相加、19. 删除链表的倒数第 N 个结点、24. 两两交换链表中的节点。 统一结构:① 题目分析与解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结。 贯穿三题的两条主线:虚拟头结点 dummy(统一处理头结点被修改的场景)与 指针修改顺序(避免断链、丢引用)。

      2401_88612756的博客 481

      蓝牙模块HM-10手册

      蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

      LeetCode 每日一题 2026/11/2-2026/11/8

      记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

      AlphaTao的博客 174

      LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

      LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

      huayimenghan的博客 197

      LeetCode 1861. 旋转盒子|Go 双指针解法

      j >= 0,如果写成j>0,会漏掉第 0 列,最左侧石头处理失败旋转矩阵行列互换:原 m 行 n 列 → 结果 n 行 m 列,make 数组长度不要写反旋转公式m-1-i:是原总行数 m,不是 n!很容易写成n-1-i区分:本题和轮转数组(189)分组循环不一样!189:所有元素固定移动 k 步,需要 gcd 分组1861:障碍物分割成多个独立段,石头向段末尾挤,用双指针更合适。

      2503_92676540的博客 175

      Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

      三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

      2403_87560480的博客 195

      LeetCode 3926. 统计有效单词的出现次数【分组循环】

      核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

      2503_92676540的博客 166

      力扣第526场周赛心得理解

      思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

      目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 198

      LeetCode 0453.最小操作次数使数组元素相等:两次遍历(反向思维)

      【LetMeFly】453.最小操作次数使数组元素相等:两次遍历(反向思维)

      <font color="Pink">Tisfy的博客</font> 202

      【算法学习笔记】LeetCode 15:三数之和(排序 + 双指针)

      使用sort()对数组进行排序。理解排序后双指针的移动原理。使用外层循环固定一个数字。使用左右指针寻找另外两个数字。使用continue和while实现去重。理解的执行逻辑。将三层循环优化为排序 + 双指针,使时间复杂度从 O(n³) 降低到 O(n²)。

      aqiu111111的博客 156

      LeetCode100 15. 三数之和

      本题通过排序+双指针优化三数之和。先对数组排序,外层遍历固定第一个数,内层用左右指针查找另两个数,使三数之和为0。通过剪枝(当前数>0则终止)和去重(跳过重复元素)提升效率。相比暴力或哈希法,该方法时间复杂度为O(n²),空间O(1),更高效优雅。

      Shaoxingzong的博客 321

      LeetCode hot 100 — 226. 翻转二叉树 | 101. 对称二叉树

      自己稀里糊涂写了一版本居然还对了,我觉得我的思想就是很简单,这里就是要交换每一个节点的左右子树,所以套用了一下之前的中序遍历的迭代套路。一直在return False,但是没有给真正的正确答案一个出口(注意递归调用中出口 / 返回值很重要,或者说是最重要的)差一步美满....用的递归的写法,差一点点就满分了,先给出自己最开始写的代码。这道题的本质是对每一个节点执行相同的操作,并且交换哪个节点在先并不重要。你可以运用递归和迭代两种方法解决这个问题吗?,翻转这棵二叉树,并返回其根节点。给你一个二叉树的根节点。

      Canmido的博客 128

      LeetCode2161~2180题目解析

      LeetCode2161~2180题目解析

      jiaomubai的博客 207

      力扣3无重复字符的最长字串(滑动窗口)

      该题使用滑动窗口+哈希集合优化,通过复用Set实现O(n)时间复杂度。若每轮循环都新建HashSet,虽逻辑正确,但需重复插入删除,退化为O(n²),导致超时。原解法利用窗口右移时仅移除左端旧字符、扩展右边界,避免重复操作,实现高效遍历。

      Pniubi的博客 226
      上一篇: 牛客2025年儿童节比赛
      下一篇: 力扣第455场周赛
      一只鱼^_
      博客等级 码龄3年 1073粉丝 92原创
      评论
      成就一亿技术人!
      拼手气红包6.0元
      还能输入1000个字符
       
       条评论被折叠 查看
      添加红包

      请填写红包祝福语或标题

      个

      红包个数最小为10个

      元

      红包金额最低5元

      当前余额3.43元 前往充值 >
      需支付:10.00元
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付元
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值