力扣第448场周赛

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样 stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc 阅读详情

赛时成绩如下: 

这应该是我力扣周赛的最好成绩了(虽然还是三题) 

1. 两个数字的最大乘积 

给定一个正整数 n。

返回 任意两位数字 相乘所得的 最大 乘积。

注意:如果某个数字在 n 中出现多次,你可以多次使用该数字。

示例 1:

输入: n = 31

输出: 3

解释:

  • n 的数字是 [3, 1]。
  • 任意两位数字相乘的结果为:3 * 1 = 3。
  • 最大乘积为 3。

示例 2:

输入: n = 22

输出: 4

解释:

  • n 的数字是 [2, 2]。
  • 任意两位数字相乘的结果为:2 * 2 = 4。
  • 最大乘积为 4。

示例 3:

输入: n = 124

输出: 8

解释:

  • n 的数字是 [1, 2, 4]。
  • 任意两位数字相乘的结果为:1 * 2 = 2, 1 * 4 = 4, 2 * 4 = 8。
  • 最大乘积为 8。

 

提示:

  • 10 <= n <= 10^9

解题思路: 模拟, 把n的每个数位都取出来存的数组里面,然后对数组进行排序, 返回最后两个数的乘积即可

class Solution {
public:
    int maxProduct(int n) {
        vector<int> ans; int cnt=0;
        while(n>0){
            ans.push_back(n%10); n/=10;
            cnt++;
        }
        sort(ans.begin(),ans.end());
        return ans[cnt-1]*ans[cnt-2];
    }
};

2. 填充特殊网格 

给你一个非负整数 N,表示一个 2^N x 2^N 的网格。你需要用从 0 到 2^2N - 1 的整数填充网格,使其成为一个 特殊 网格。一个网格当且仅当满足以下 所有 条件时,才能称之为 特殊 网格:

右上角象限中的所有数字都小于右下角象限中的所有数字。
右下角象限中的所有数字都小于左下角象限中的所有数字。
左下角象限中的所有数字都小于左上角象限中的所有数字。
每个象限也都是一个特殊网格。
返回一个 2^N x 2^N 的特殊网格。

注意:任何 1x1 的网格都是特殊网格。

解题思路: 左上>左下>右下>右上,构造的网格是2^N*2^N, N=1时为2*2的网格,N=2时为4*4的网格...递归的进行划分即可, 2^N*2^N划分成4个子网格, 每个子网格大小为2^N-1*2^N-1大小,填充的时候我们就按 (左上>左下>右下>右上), 这个顺序进行填充每个子网格, 右上最小先填充右上, 递归参数分别为:(r, c)当前子网格的左上角坐标, size: 当前子网格的边长, or_grid: 当前子数组的起始填充数字, grid: 待填充的数组, 

1. 右上:从(r,c+half) 开始,填充从or_grid数字开始的area个数字

2. 右下:从(r+half, c+half) 开始, 填充从or_grid+1*area数字开始的area个数字

3. 左下:从(r+half,c) 开始, 填充从or_grid+2*area数字开始的area个数字

4. 左上:从(r,c) 开始, 填充从or_grid+3*area数字开始的area个数字

如果你对递归熟练的话,其实很简单的,当然你递归参数也可以是上下左右边界,应该也是可以的

class Solution {
public:
    void solve(int r, int c, int size, int or_grid, vector<vector<int>>& grid) {
        if (size == 1) {
            grid[r][c] = or_grid;
            return;
        }
        int half = size / 2;
        int area = half * half;
        solve(r, c + half, half, or_grid + 0 * area, grid);
        solve(r + half, c + half, half, or_grid + 1 * area, grid);
        solve(r + half, c, half, or_grid + 2 * area, grid);
        solve(r, c, half, or_grid + 3 * area, grid);
    }
    vector<vector<int>> specialGrid(int N) {
        int size = 1 << N;
        vector<vector<int>> grid(size, vector<int>(size,0));
        solve(0, 0, size, 0, grid);
        return grid;
    }
};

补充代码: 

class Solution {
public:
    void solve(int r, int c, int size, int or_grid, vector<vector<int>>& grid) {
        if (size == 1) {
            grid[r][c] = or_grid;
            return;
        }
        int half = size / 2;
        int area = half * half;
        solve(r, c + half, half, or_grid + 0 * area, grid);
        solve(r + half, c + half, half, or_grid + 1 * area, grid);
        solve(r + half, c, half, or_grid + 2 * area, grid);
        solve(r, c, half, or_grid + 3 * area, grid);
    }
    vector<vector<int>> specialGrid(int N) {
        int size = 1 << N;
        vector<vector<int>> grid(size, vector<int>(size,0)); int val=0;
        auto dfs=[&](this auto&& dfs,int u,int d,int l,int r)->void{
            if(d-u==1){
                grid[u][l]=val; val++;
                return;
            }
            int m=(d-u)/2;
            dfs(u,u+m,l+m,r);       //右上
            dfs(u+m,d,l+m,r);       //右下
            dfs(u+m,d,l,l+m);       //左下
            dfs(u,u+m,l,l+m);       //左上
        };
        dfs(0,size,0,size);
        return grid;
    }
};
// [0,2^N) [0,1,2,3,4) (0+2^N)/2, m即是左边子数组的右边界(开), 又是右边子数组的左边界(闭)

3. 合并得到最小旅行时间 

给你一个长度为 l 公里的直路,一个整数 n,一个整数 k 和 两个 长度为 n 的整数数组 position 和 time 。

数组 position 列出了路标的位置(单位:公里),并且是 严格 升序排列的(其中 position[0] = 0 且 position[n - 1] = l)。

每个 time[i] 表示从 position[i] 到 position[i + 1] 之间行驶 1 公里所需的时间(单位:分钟)。

你 必须 执行 恰好 k 次合并操作。在一次合并中,你可以选择两个相邻的路标,下标为 i 和 i + 1(其中 i > 0 且 i + 1 < n),并且:

  • 更新索引为 i + 1 的路标,使其时间变为 time[i] + time[i + 1]。
  • 删除索引为 i 的路标。

返回经过 恰好 k 次合并后从 0 到 l 的 最小总旅行时间(单位:分钟)。

解题思路:这是一道划分划分型DP, 本来DP就弱,还好久没写类似的题了,第二题那个递归都写了十几分钟

在我们进行动态规划,设计状态的时候,原状态删除了一个数字,对后续子状态产生影响的话,那这个状态设计就是有问题的

 l = 10, n = 4, k = 1, position = [0,3,8,10], time = [5,8,3,6]

[0,3]: 5(行驶一公里所用时间), [3,8]: 8, [8,10]: 3 [10,..]: 6

合并下标为 1 和 2 的路标,合并后:position=[0,8,10] , time=[5,11,6]

删除position[1], 此时我们把time[2]修改成8+3=11,对后续子状态产生影响了。

 

题目中说要进行k次合并,就会产生一个子数组,eg: time=[5,8,3,6] 合并一次后就变为[5],[8,3],[6], 恰好分成了n-k(4-1=3)个连续子数组,我们用区间[i.j] 来表示划分后的子数组。

对于两个相邻的子数组[i,j] ,[j+1,k], 我们需要从position[j] -> position[k], (i已经被删除了,选靠右的) ,每公里所需的时间为A的元素和。

设time的前缀和数组为prefix, 上述移动对答案的贡献为 (position[k]−position[j])* (s[j+1]−s[i])

eg: [5],[8,3],[6], A=[8,3], B=[6], 对应从position[2]=8, 移动到position[3]=10, 10-8=2, time=prefix[3]-prefix[1]=8+3-5=8+3=11, 所以这段的旅行的时间为2*11=22

在从左向右进行模拟的过程中,有当前子数组[i,j], 需要恰好left_K次合并操作

定义状态dfs(i,j,left_K), 完成剩余left_K 次合并后所需的最小总旅行时间

我们要枚举中间子数组已经了多少次合并操作,

枚举下一个子数组的右端点 k=j+1,j+2,…,min(n−1,j+1+leftK),这意味着我们执行了 k−j−1 次合并操作,接下来要解决的问题变成:

1. 当前子数组为 [j+1,k]。
2. 还需执行恰好 leftK−(k−j−1) 次合并操作。
在上述情况下,完成剩余旅程需要的最小旅行时间,即 dfs(j+1,k,leftK−(k−j−1))。这两个子数组 [i,j] 和 [j+1,k] 对总旅行时间的贡献为 (position[k]−position[j])⋅(s[j+1]−s[i])。上述所有右端点k取最小值为某个阶段,递归边界:

递归边界:当 j=n−1 时,必须有 leftK=0,所以 dfs(i,n−1,0)=0。

递归入口:dfs(0,0,k),即答案。注意第一个子数组一定是 [0,0]。

 补充如下:

class Solution {
public:
    int minTravelTime(int l, int n, int k, vector<int>& position, vector<int>& time) {
        vector<int> prefix(n,0);
        for(int i=0;i<n-1;i++){
            prefix[i+1]=prefix[i]+time[i];
        }
        vector<vector<vector<int>>> memo(n-1, vector<vector<int>>(n-1, vector<int>(k+1)));
        return dfs(0,0,k,position,prefix,memo);
    }
    int dfs(int i,int j,int left_K, vector<int>& position,vector<int>& prefix,vector<vector<vector<int>>>& memo){
        int n=position.size();
        if(j==n-1){
            return left_K>0?INT_MAX/2:0;
        }
        if(memo[i][j][left_K]>0){
            return memo[i][j][left_K];
        }
        int res=INT_MAX;
        int t=prefix[j+1]-prefix[i];
        for(int k=j+1;k<min(n,j+2+left_K);k++){
            int r=dfs(j+1,k,left_K-(k-j-1),position,prefix,memo)+(position[k]-position[j])*t;
            res=min(res,r);
        }
        memo[i][j][left_K]=res;
        return res;
    }
};
// 1. [0,l]的道路, position数组为道路上路标的位置, 其中 position[0] = 0 且 position[n - 1] = l
// 2. time[i] 表示从 position[i](路标1) 到 position[i + 1](路标2), 行驶1km所需的时间
// 3. 你需要执行k次合并操作 -> 选择两个相邻的路标,下标为 i 和 i + 1, 删除i路标,  times[i+1]=times[i]+times[i+1],(times[n-1]没用, 只用于合并{i和i+1})
    
// dfs(0,n-1)-> dfs(0,i)+dfs(i,n-1) 
// 状态变量left,right,k,  额外维护一个pre

JAVA版:

class Solution {
    public int minTravelTime(int l, int n, int k, int[] position, int[] time) {
        int[] prefix=new int[n];
        for(int i=0;i<n-1;i++){
            prefix[i+1]=prefix[i]+time[i];
        }   
        int[][][] memo = new int[n - 1][n - 1][k + 1];
        return dfs(0, 0, k, position, prefix, memo); // 第一个子数组是 [0, 0]
    }
    private int dfs(int i, int j, int left_K, int[] position, int[] prefix, int[][][] memo) {
        int n = position.length;
        if (j == n - 1) { 
            return left_K > 0 ? Integer.MAX_VALUE / 2 : 0; 
        }
        if (memo[i][j][left_K] > 0) { 
            return memo[i][j][left_K];
        }
        int res = Integer.MAX_VALUE;
        int t = prefix[j + 1] - prefix[i]; 
        for (int k = j + 1; k < Math.min(n, j + 2 + left_K); k++) {
            int r = dfs(j + 1, k, left_K - (k - j - 1), position, prefix, memo) + (position[k] - position[j]) * t;
            res = Math.min(res, r);
        }
        memo[i][j][left_K] = res; return res;
    }
}

4. 魔法序列的数组乘积之和 

给你两个整数 M 和 K,和一个整数数组 nums。

一个整数序列  seq 如果满足以下条件,被称为  魔法 序列:
  • seq 的序列长度为 M。
  • 0 <= seq[i] < nums.length
  • 2seq[0] + 2seq[1] + ... + 2seq[M - 1] 的 二进制形式 有 K 个 置位。

这个序列的 数组乘积 定义为 prod(seq) = (nums[seq[0]] * nums[seq[1]] * ... * nums[seq[M - 1]])。

返回所有有效 魔法 序列的 数组乘积 的 总和 。

由于答案可能很大,返回结果对 10^9 + 7 取模。

置位 是指一个数字的二进制表示中值为 1 的位。

解题思路:这题其实也很难,我过的很大一部分原因是洛谷有类似的题, 

魔法序列的定义(题意):
长度为 M 的序列 seq,其中每个元素 seq[i] 满足 0 <= seq[i] < nums.length
将序列中的每个元素作为 2 的幂次,即 2^seq[0] + 2^seq[1] + ... + 2^seq[M-1],这个和的二进制表示中 1 的位数必须等于 K
序列的数组乘积是 nums[seq[0]] * nums[seq[1]] * ... * nums[seq[M-1]]
我们需要计算所有满足条件的魔法序列的数组乘积的总和,并对 1e9 + 7 取模

具体的思考过程如下:

seq的序列总共M个数, 每个元素seq[i] -> [0,N-1]
eg: M=7, 选出的seq序列为[0,0,0,1,1,1,1] -> prod(seq)=nums[0]^3*nums[1]^4
我们先不管题目中魔法序列的第3个条件, 假设上述选出的seq序列是符合条件的
那么它的全排列肯定也是符合条件的, 但是由于seq序列里面有重复的0和1, 
因此, 7!/(3!*4!)个  nums[0]^3*nums[1]^4 的总和即为答案
总结式子: M!*(nums[0]^3/3!)*(nums[1]^4/4!) -> 我们选出的数(eg: nums[0]) 对答案的贡献值就是(nums[0]^3/3!)
    
eg: [0,0,0,1,1,1,1,2,2] [0,0,0,1,1,2,2,2,2] 
上述两个seq序列可以写成{nums[0]^3/3!}*(nums[1]^4/4! * nums[2]^2/2! + nums[1]^2/2! * nums[2]^4/4!)
注:上述两个seq序列的后6位其实是一个子问题(类似于我们前面选了3个0, 后续每一位应该怎么选)
    
eg: A={00111.... 0011...}, B={00011122.. 00011222...}
当我们枚举(1个0/2个0...)的时候, (括号中的)情况是加法的关系, 但是单独一个序列(eg: 00011122..)后面(1/2), 的子问题是乘法的关系。 

状态设计:
我们接下来看[魔法 序列] 的第三个条件, eg: 0001111 -> 2^0+2^0+2^0+2^1+2^1+2^1+2^1
i: 现在选的是seq[i] -> [0,N-1]
2. seq序列总长: M
3. 序列总和的二进制位: S(二进制位中1的个数等于K)
dfs(i,left_M,S)  根据数据范围得知, S的总和太大了, 因此就上述设计就不太合适了。
我们经过观察得知, 2^i加到当前序列总和S中时, 它只会对i左侧的高位产生进位的影响, 不会对右侧的低位产生进位的影响。
此时,我们就可以在一边累计2^i的时候, 一边用ans_count去统计S低位中1的个数了。此时我们通过右移操作, 就可以将原状态个数进行缩减
原状态设计中的第三个参数, 就可以修改成S右移后的值, 增加第四个参数为, left_K: 低二进制位中1的个数

 代码如下:

const int p=1e9 + 7;
const int MX=31;
long long F[MX]; //F[i] =i;
long long INV_F[MX]; //INV_F[i]=i!^-1
int quPow(long long a,int n){
    int res=1;
    while(n){
        if(n&1) res=res*a%p;
        a=a*a%p;
        n>>=1;
    }
    return res;
}
void init(){
    F[0] = 1;
    for (int i = 1; i < MX; i++) {
        F[i] = F[i - 1] * i % p;
    }
    INV_F[MX - 1] = quPow(F[MX - 1],p - 2);
    for (int i = MX - 1; i; i--) {
        INV_F[i - 1] = INV_F[i] * i % p;
    }
}
class Solution {
public:
    int magicalSum(int m, int k, vector<int>& nums) {
        init();
        int n = nums.size();
        vector pow_v(n, vector<int>(m + 1));
        for (int i = 0; i < n; i++) {
            pow_v[i][0] = 1;
            for (int j = 1; j <= m; j++) {
                pow_v[i][j] = 1LL * pow_v[i][j - 1] * nums[i] % p;
            }
        }

        vector memo(n, vector(m + 1, vector(m / 2 + 1, vector<int>(k + 1, -1))));
        auto dfs = [&](this auto&& dfs, int i, int left_m, int x, int left_k) -> int {
            int c1 =__builtin_popcount(x);
            if (c1 + left_m < left_k) {
                return 0;
            }
            if (i == n) {
                return left_m == 0 && c1 == left_k;
            }
            int& res = memo[i][left_m][x][left_k]; 
            if (res != -1) {
                return res;
            }
            res = 0;
            for (int j = 0; j <= left_m; j++) { 
                int bit = (x + j) & 1; 
                if (bit <= left_k) {
                    int r = dfs(i + 1, left_m - j, (x + j) >> 1, left_k - bit);
                    res = (res + 1LL * r * pow_v[i][j] % p * INV_F[j]) % p;
                }
            }
            return res;
        };
        return 1LL * dfs(0, m, 0, k) * F[m] % p;
    }
};


seq的序列总共M个数, 每个元素seq[i] -> [0,N-1]
eg: M=7, 选出的seq序列为[0,0,0,1,1,1,1] -> prod(seq)=nums[0]^3*nums[1]^4
我们先不管题目中魔法序列的第3个条件, 假设上述选出的seq序列是符合条件的
那么它的全排列肯定也是符合条件的, 但是由于seq序列里面有重复的0和1, 
因此, 7!/(3!*4!)个  nums[0]^3*nums[1]^4 的总和即为答案
总结式子: M!*(nums[0]^3/3!)*(nums[1]^4/4!) -> 我们选出的数(eg: nums[0]) 对答案的贡献值就是(nums[0]^3/3!)
    
eg: [0,0,0,1,1,1,1,2,2] [0,0,0,1,1,2,2,2,2] 
上述两个seq序列可以写成{nums[0]^3/3!}*(nums[1]^4/4! * nums[2]^2/2! + nums[1]^2/2! * nums[2]^4/4!)
注:上述两个seq序列的后6位其实是一个子问题(类似于我们前面选了3个0, 后续每一位应该怎么选)
    
eg: A={00111.... 0011...}, B={00011122.. 00011222...}
当我们枚举(1个0/2个0...)的时候, (括号中的)情况是加法的关系, 但是单独一个序列(eg: 00011122..)后面(1/2), 的子问题是乘法的关系。 

状态设计:
我们接下来看[魔法 序列] 的第三个条件, eg: 0001111 -> 2^0+2^0+2^0+2^1+2^1+2^1+2^1
i: 现在选的是seq[i] -> [0,N-1]
2. seq序列总长: M
3. 序列总和的二进制位: S(二进制位中1的个数等于K)
dfs(i,left_M,S)  根据数据范围得知, S的总和太大了, 因此就上述设计就不太合适了。
我们经过观察得知, 2^i加到当前序列总和S中时, 它只会对i左侧的高位产生进位的影响, 不会对右侧的低位产生进位的影响。
此时,我们就可以在一边累计2^i的时候, 一边用ans_count去统计S低位中1的个数了。此时我们通过右移操作, 就可以将原状态个数进行缩减
原状态设计中的第三个参数, 就可以修改成S右移后的值, 增加第四个参数为, left_K: 低二进制位中1的个数

5. P7961 [NOIP2021] 数列 - 洛谷 

题目描述
给定整数 n,m,k,和一个长度为 m+1 的正整数数组 v0​,v1​,…,vm​。
对于一个长度为 n,下标从 1 开始且每个元素均不超过 m 的非负整数序列 {ai​},我们定义它的权值为 va1​​×va2​​×⋯×van​​。

当这样的序列 {ai​} 满足整数 S=2a1​+2a2​+⋯+2an​ 的二进制表示中 1 的个数不超过 k 时,我们认为 {ai​} 是一个合法序列。

计算所有合法序列 {ai​} 的权值和对 998244353 取模的结果。

输入格式
输入第一行是三个整数 n,m,k。

第二行 m+1 个整数,分别是 v0​,v1​,…,vm​。

输出格式
仅一行一个整数,表示所有合法序列的权值和对 998244353 取模的结果。

两题的区别就是,数组起始索引不同,第一题是等于k, 第二题是<=k 

感谢大家的点赞和关注,你们的支持是我创作的动力!(其他细节,有时间再补充...)

 

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧) 本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。 阅读详情

相关推荐

【星火】海思HI3516C开发板实战:基于LVGL与MPP库的行车记录仪/电子显微镜方案

本文详细介绍了基于海思HI3516CV500开发板,结合LVGL图形库与海思MPP媒体处理平台,实现行车记录仪与电子显微镜方案的完整实战过程。内容涵盖从系统环境搭建、驱动配置到应用开发的全流程,重点解析了MPP视频流处理管道与LVGUI界面协同工作的核心机制,为嵌入式音视频开发提供了可复用的参考方案。

weixin_42126677的博客 160

LeetCode第448场周赛

LeetCode第448场周赛.

qq_64359561的博客 829

交通流预测爬坑记(一):交通流数据集,原始数据

常用的交通流数据集,持续更新~~

K_first的博客 4万+

【Leetcode第216场周赛】score:18 Time: 1:06:18 Rank:448/3856

今天这次周赛是手速场,技巧性不是很强 5605. 检查两个字符串数组是否相等(3分,通过率:2853/3210) 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。 class Solution: def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:

木土木土木土的日常 237

一种解决STM32多串口同时收发的方法

在做项目中,遇到了同时调用串口通信时程序崩溃的问题,在项目中,串口1用作调试串口,串口2用作MQTT通信串口,串口3用作下位机通信串口, 串口1重定向以后,用库函数自带的printf函数打印字符串 串口2使用自己写的u2_printf函数,即va_list这套变参宏定义后使用vsprintf函数打印字符串 串口3刚开始使用串口2一样的打印方式,程序在调试调用到串口3打印函数时直接崩溃,后续将串口3改用dma转存输出,仍然无法正常调用 多次研究以后,采用三个串口都使用重定向后的库函数自带的printf

Zxp0605的博客 8796

哈希拓展攻击CTF题做法

kali下载相关工具hash-ext-attack:hash拓展题目特征:2023楚慧杯upload_shell实验吧之让我进去:前言:具体怎么加密解密补位的原理我不懂,深入理解的部分我在文末挂了链接,以下也只是我做题的结论和通解,可能不准确(但是做题还挺准确),有错误欢迎指出:是在密码加密过程中引入的一个随机值,它与密码结合使用,目的是增加密码的复杂性和安全性。在密码加密中,常见的做法是将用户提供的密码进行哈希处理,然后存储哈希值而不是明文密码

2301_76690905的博客 2418

Leetcode周赛记录

开这篇博客的目的就是激励自己不断进步。 2019年9月22日 155场周赛 419名/1602名,刷题记录:题目1完成。 2019年9月29日 156场周赛 242/1432,通过题目:题目1,题目2,题目3。 ...

一名正在成长的程序员 4287

某头部金融APP防护机制逆向实录:从反调试到TEE加密的全链路攻防拆解

金融APP安全防护体系深度破解分析 本文详细拆解了某头部金融APP的三重防御机制破解过程。首先通过Frida绕过反调试技术,包括ptrace自我绑定、TracerPid检测和debuggerd监控;随后针对12种Root检测方法(如su文件检查、Magisk检测等)进行环境伪装,通过Hook系统调用伪造安全环境;最后逆向分析TEE加密模块,解密关键接口参数。整个破解过程涉及静态分析、动态调试和代码注入技术,揭示了金融级APP安全防护的实现原理与突破方法(注:所有操作均获授权,仅用于安全研究)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1399

leetcode1310. 子数组异或查询

最近一直没参加周赛,今天遇到这道题,感觉有点意思,可以试着写下心路历程 题目: 有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。 对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li]...

孤竹彧的根据地 424

vLLM专题(七)-支持的模型列表

vLLM支持跨多种任务的生成式和池化模型。如果一个模型支持多个任务,您可以通过–task参数来设置任务。对于每个任务,我们列出了已在vLLM中实现的模型架构。每个架构旁边,我们列出了一些使用该架构的流行模型。

1257

详述 MIMIC 数据库26张数据表(一)

作者按照自身理解和实验要求对MIMIC-III的26张数据表进行整理归纳并进行介绍。

越努力 越幸运 7236

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

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

2401_88612756的博客 352

HFSS实战项目——Ku波段微带发夹线滤波器

保姆级教程!!!看完必会,非常详细!!!Ku频段5阶切比雪夫微带线带通滤波器的仿真实例。首先介绍了滤波器的技术指标和基本理论知识,重点介绍了滤波器的耦合系数和外部品质因数。建立了谐振器的设计模型、耦合系数与谐振器间距的设计模型、外部品质因数与抽头位置的设计模型和滤波器整体电路的模型。详细介绍了谐振器设计模型的建立步骤。

2401_87464239的博客 3037

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

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

2401_88612756的博客 481

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

AlphaTao的博客 173

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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
上一篇: 力扣第447场周赛
下一篇: 牛客练习赛138(首篇万字题解???)
一只鱼^_
博客等级 码龄3年 1073粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值