【前缀和】

目录

  • 知识框架
  • No.0 筑基
  • No.1一维前缀和
  • No.2 二维前缀和
    • 题目来源:Acwing-796. 子矩阵的和
  • No.1 普通前缀和
    • 题目来源:牛客网-NC14556:数圈圈
    • 题目来源:牛客网-NC14600:珂朵莉与宇宙
    • 题目来源:牛客网-NC21195 :Kuangyeye and hamburgers
    • 题目来源:牛客网-NC19798:区间权值
    • 题目来源:牛客网-NC15035:送分了qaq
  • No.3 leetcode的之前做的前缀和
    • 前缀和+哈希表
    • 滑动窗口模板
    • [209. 长度最小的子数组](https://leetcode.cn/problems/minimum-size-subarray-sum/):滑动窗口
    • [238. 除自身以外数组的乘积](https://leetcode.cn/problems/product-of-array-except-self/) 前缀和+后缀和
    • [1004. 最大连续1的个数 III](https://leetcode.cn/problems/max-consecutive-ones-iii/):滑动窗口
    • [1124. 表现良好的最长时间段](https://leetcode.cn/problems/longest-well-performing-interval/):前缀和+单调栈
    • [724. 寻找数组的中心下标](https://leetcode.cn/problems/find-pivot-index/):前缀和
    • [560. 和为 K 的子数组](https://leetcode.cn/problems/subarray-sum-equals-k/):前缀和+哈希表
    • [1248. 统计「优美子数组」](https://leetcode.cn/problems/count-number-of-nice-subarrays/):前缀和+哈希表
    • [974. 和可被 K 整除的子数组](https://leetcode.cn/problems/subarray-sums-divisible-by-k/):前缀和+哈希表
    • [523. 连续的子数组和](https://leetcode.cn/problems/continuous-subarray-sum/):前缀和+哈希表
    • [930. 和相同的二元子数组](https://leetcode.cn/problems/binary-subarrays-with-sum/):前缀和+哈希表
    • [904. 水果成篮](https://leetcode.cn/problems/fruit-into-baskets/):滑动窗口+哈希表
    • [904. 水果成篮](https://leetcode.cn/problems/fruit-into-baskets/):滑动窗口+哈希表

知识框架

No.0 筑基

请先学习下知识点,道友!
题目知识点大部分来源于此:前缀和

题目例题大部分来源于此:

No.1一维前缀和

S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]

No.2 二维前缀和

题目来源:Acwing-796. 子矩阵的和

题目描述:
在这里插入图片描述

题目思路:

模板:

S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]

题目代码:

#include <iostream>

using namespace std;

const int N = 1010;

int n, m, q;
int a[N][N], s[N][N];

int main()
{
    scanf("%d%d%d", &n, &m, &q);//因为数据规模比较大所以建议用scanf
    for (int i = 1; i <= n; i ++ )
    {
        for (int j = 1; j <= m; j ++ ) scanf("%d", &a[i][j]);
    }
    
    for (int i = 1; i <= n; i ++ )
    {
        for (int j = 1; j <= m; j ++ ) s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + a[i][j];
    }//初始化前缀和数组
    
    while (q--)
    {
        int x1, y1, x2, y2;
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);
    }//询问
    
    return 0;
}//该代码引用AcWing网站的代码

No.1 普通前缀和

题目来源:牛客网-NC14556:数圈圈

题目描述:
在这里插入图片描述

题目思路:

题目代码:

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 1001000
long long n,m,t,k,d;
long long x,y,z;
char ch;
string str;
vector<int>v[N];
int num[10]={1,0,0,0,1,0,1,0,2,1}; //0~9
int onum[N+1];
int s[N+1];
void Init(){
    for(int i=1;i<=N;i++){
        str=to_string(i);
        for(auto ss:str){
            int num1=ss-'0';
            onum[i]+=num[num1];
        }
    }
    s[1]=0;
    for(int i=2;i<=N;i++){
        s[i]=s[i-1]+onum[i];
    }
}
int main()
{
    Init();
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x>>y;
        cout<<s[y]-s[x-1]<<endl;
    }
    return 0;
}

题目来源:牛客网-NC14600:珂朵莉与宇宙

题目描述:
在这里插入图片描述

题目思路:

题目代码:

//巧妙地利用求平方 变化为减去平方看差是否存在:
//通过指针的指向,那么一串数组中的任意子区间就可以用 两个前缀和 进行 相减 得到:

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 100100
long long n,m,t,k,d;
long long x,y,z,c;
char ch;
string str;
vector<int>v[N];
int s[N+1];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        s[i]=s[i-1]+x;
    }
    int res=0;
    int cnt[N];
    cnt[0]=1;    //前缀和为0的表示 直接前面n个为平方和了
    //以每一个右边的端点为指针
    for(int i=1;i<=n;i++){
        //找到所有可能的平方和://处理第i个前缀和的所有完全平方数
        for(int j=0;j*j<=s[i];j++){

            c=s[i]-j*j;         //假设前面有前缀和==c的; 即
            if(cnt[c]>0){       //如果前面有前缀和==c的 代表有子区间为j*j;
                res+=cnt[c];
            }
        }
        cnt[ s[i] ]++;   // 已处理过的这个端点,加入到cnt里面  表示前面的 前缀和为s[i] 的前缀和的个数加一
    }
    cout<<res;
    return 0;
}

题目来源:牛客网-NC21195 :Kuangyeye and hamburgers

题目描述:

题目思路:

题目代码:

//vector 的 排序 比如降序:  sort(v.rbegin(),v.rend());
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 100100
long long n,m,t,k,d;
long long x,y,z,c;
char ch;
string str;
vector<int>v[N];
int s[N+1]={0};

int main()
{
    cin>>n>>m;
    vector<int>ans;
    for(int i=1;i<=n;i++){
        cin>>x;
        ans.push_back(x);
    }
    sort(ans.rbegin(),ans.rend());
    for(int i=0;i<ans.size();i++){
        s[i+1]=s[i]+ans[i];
    }
    int res=0;
    while(m--){
        cin>>x>>y;

        res=max(res,s[y]-s[x-1]);
    }
    cout<<res<<endl;
    return 0;
}

题目来源:牛客网-NC19798:区间权值

题目描述:
在这里插入图片描述

题目思路:

题目代码:

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define N 100100
long long n,m,t,k,d;
long long x,y,z,c;
char ch;
string str;
vector<int>v[N];
int s[N+1]={0};
int w[N+1];
int leijia(int l,int r){
    return (s[r]-s[l-1])*w[r-l+1];
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        s[i]=s[i-1]+x;
    }
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    

    //下面这个双层循环了导致时间复杂度很高:
    long long res=0;
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j++){
            res=res+leijia(i,j);
        }
    }
    //将 j 的那部分再进行前缀和:因此要把过程改写:
    for(int j=1;j<=n;j++){
        
    }
    
    cout<<res%(1000000000+7);
    return 0;
}

题目来源:牛客网-NC15035:送分了qaq

经典基础:对x经行分位数处理,直到没有位数

#include<stdio.h>
int check(int x)
{
    int t=0;
    while(x > 0)//对x经行分位数处理,直到没有位数
   {
        if(x % 10 == 3)
        {
            return 1;//如果已经有1接下来的位数便不用再判断了,直接可以return 1了
        }
        x /= 10;
    }
    return 0;
}
 
#include <stdio.h>
int main()
{
	int m,n;
	while(scanf("%d%d",&n,&m)!=EOF)
	{if (m == 0 && n == 0)
            break;
	int ans=0;
		for(int i=n;i<=m;i++)
		{
			int x=i;
			while(x)
			{
			if(x%10==4||x%100==38) {ans++;break;}
			x/=10;
			}
		}
		printf("%d\n",ans);
	}
 } 

No.3 leetcode的之前做的前缀和

【动画模拟】一文秒杀七道题 - 连续的子数组和 - 力扣(LeetCode)

前缀和+哈希表

要想着变化方程式,,比如哈希表的那个 pre[i] - pre[j-1] = k 变化为 pre[i] - k ; 找存在。

滑动窗口模板

滑动窗口是什么呢? 可能是 一个start指针,一个end指针,进而进行滑动,根据一些题目条件进行移动。。

《挑战程序设计竞赛》这本书中把滑动窗口叫做「虫取法」,我觉得非常生动形象。因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。

我分享一个滑动窗口的模板,能解决大多数的滑动窗口问题:

def findSubArray(nums):
    N = len(nums) # 数组/字符串长度
    left, right = 0, 0 # 双指针,表示当前遍历的区间[left, right],闭区间
    sums = 0 # 用于统计 子数组/子区间 是否有效,根据题目可能会改成求和/计数
    res = 0 # 保存最大的满足题目要求的 子数组/子串 长度
    while right < N: # 当右边的指针没有搜索到 数组/字符串 的结尾
        sums += nums[right] # 增加当前右边指针的数字/字符的求和/计数
        while 区间[left, right]不符合题意: # 此时需要一直移动左指针,直至找到一个符合题意的区间
            sums -= nums[left] # 移动左指针前需要从counter中减少left位置字符的求和/计数
            left += 1 # 真正的移动左指针,注意不能跟上面一行代码写反
        # 到 while 结束时,我们找到了一个符合题意要求的 子数组/子串
        res = max(res, right - left + 1) # 需要更新结果
        right += 1 # 移动右指针,去探索新的区间
    return res


滑动窗口中用到了左右两个指针,它们移动的思路是:以右指针作为驱动,拖着左指针向前走。右指针每次只移动一步,而左指针在内部 while 循环中每次可能移动多步。右指针是主动前移,探索未知的新区域;左指针是被迫移动,负责寻找满足题意的区间。

模板的整体思想是:

  1. 定义两个指针 leftright 分别指向区间的开头和结尾,注意是闭区间;定义 sums 用来统计该区间内的各个字符出现次数;

  2. 第一重 while 循环是为了判断 right 指针的位置是否超出了数组边界;当 right 每次到了新位置,需要增加 right 指针的求和/计数;

  3. 第二重 while 循环是让 left 指针向右移动到 [left, right] 区间符合题意的位置;当 left 每次移动到了新位置,需要减少 left 指针的求和/计数;

  4. 在第二重 while 循环之后,成功找到了一个符合题意的 [left, right] 区间,题目要求最大的区间长度,因此更新 res 为 max(res, 当前区间的长度) 。

  5. right 指针每次向右移动一步,开始探索新的区间。

  6. 模板中的 sums 需要根据题目意思具体去修改,本题是求和题目因此把sums 定义成整数用于求和;如果是计数题目,就需要改成字典用于计数。当左右指针发生变化的时候,都需要更新 sums

209. 长度最小的子数组:滑动窗口

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int ans = INT_MAX;
        int start = 0, end = 0;
        int sum = 0;
        while (end < n) {
            sum += nums[end];
            while (sum >= s) {
                ans = min(ans, end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

238. 除自身以外数组的乘积 前缀和+后缀和

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        int sumq[n];
        int sumh[n];
        for(int i=0;i<n;i++){
            if(i==0)sumq[i]=nums[i];
            else sumq[i]=sumq[i-1]*nums[i];
        }
        for(int i=n-1;i>=0;i--){
            if(i==n-1)sumh[i]=nums[i];
            else sumh[i]=sumh[i+1]*nums[i];
        }
        vector<int>ans;
        ans.push_back(sumh[1]);
        for(int i=1;i<n-1;i++){
            ans.push_back(sumq[i-1]*sumh[i+1]);
        }
        ans.push_back(sumq[n-2]);
        return ans;
    }
};

1004. 最大连续1的个数 III:滑动窗口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGuEapDr-1679671888186)(D:/Typora/images/image-20221020153751247.png)]

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n=nums.size();
        int left = 0,right=0,sum=0;
        int res=0;
        for( ;right<n;right++){
            if(nums[right]==0)sum++;
            while(sum>k){
                if(nums[left]==0)sum--;
                left++;
            }
            res=max(res,right-left+1);
        }
        return res;
    }
};

1124. 表现良好的最长时间段:前缀和+单调栈

// 首先尝试滑动窗口 进行 求解,,但是不行,只能通过一半。
//我一开始也以为是滑动窗口,但想这样的case:[1,2,3,9,9,9,9,9];类似这样的滑窗做不了
class Solution {
public:
    int longestWPI(vector<int>& hours) {
        int n=hours.size();
        int left=0,right=0,sum1=0;
        int res=0;
        for(;right<n;right++){
            if(hours[right]>8)sum1++;
            else sum1--;
            while(sum1<=0&&left<=right){
                if(sum1<=0&&left==right)break;
                if(hours[left]>8)sum1--;
                else sum1++;
                left++;
            }
            
            res=max(res,right-left+1);
        }
        return res;

    }
};



// 下面的有点偏暴力了
class Solution {
public:
    int longestWPI(vector<int>& hours) {
        int n=hours.size();
        int sum[n];
        int nums[n];
        for(int i=0;i<n;i++){
            if(hours[i]>8)nums[i]=1;
            else nums[i]=-1;
        }
        sum[0]=nums[0];
        for(int i=1;i<n;i++){
            sum[i]=nums[i]+sum[i-1];
        }
        int left=0,right=0,sum1=0;
        int res=0;
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                if(sum[j]-sum[i]+nums[i]>0){   //特别是这个判断条件的  +nums[i]
                    res=max(res,j-i+1);
                }
            }
        }
        return res;
    }
};

724. 寻找数组的中心下标:前缀和

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n=nums.size();
        int sum[n+1];
        sum[0]=0;
        for(int i=0;i<n;i++){
            sum[i+1]=sum[i]+nums[i];
        }
        vector<int>ans;
        for(int i=1;i<=n;i++){
            int left = sum[i-1];
            int right = sum[n]-sum[i];
            if(left==right){
                ans.push_back(i-1);
            }
        }
        if(ans.size()==0)return -1;
        else return ans[0];
    }
};

560. 和为 K 的子数组:前缀和+哈希表

思路:其实我们现在这个题目和两数之和原理是一致的,只不过我们是将所有的前缀和该前缀和出现的次数存到了 map 里。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ikxzAXnr-1679671888186)(D:/Typora/images/image-20221025191243786.png)]

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        map<int,int>mp;
        mp[0]=1;//是从开始到自身即pre[i]-k=0;即
        int n=nums.size();
        int pre[n+1];
        pre[0]=0;
        int res=0;
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]+nums[i-1];
            if(mp.find(pre[i]-k)!=mp.end()){
                res+=mp[pre[i]-k];
            }
            mp[pre[i]]++;
        }
        return res;
    }
};

1248. 统计「优美子数组」:前缀和+哈希表

思路”要想着变化方程式;;;

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        int res=0;
        int n=nums.size();
        int pre[n+1];
        pre[0]=0;
        map<int,int>mp;
        mp[0]=1;
        for(int i=0;i<n;i++){
            if(nums[i]%2==0){
                nums[i]=0;
            }else{
                nums[i]=1;
            }
        }
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]+nums[i-1];
            if(mp.find(pre[i]-k)!=mp.end()){
                res+=mp[pre[i]-k];
            }
            mp[pre[i]]++;
        }
        return res;

    }
};

974. 和可被 K 整除的子数组:前缀和+哈希表

其中 巧妙的 还是 方程变化。 以及对 负数的处理。

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        map<int,int>mp;
        mp[0]=1;
        int n=nums.size();
        int pre[n+1];
        pre[0]=0;
        int res=0;
        for(int i=1;i<=n;i++){
            // 注意负数 的问题。
            pre[i]=pre[i-1]+nums[i-1];
            if(mp.find((pre[i]%k+k)%k)!=mp.end()){
                res+=mp[(pre[i]%k+k)%k];
            }
            mp[(pre[i]%k+k)%k]++;
        }
        return res;

    }
};

523. 连续的子数组和:前缀和+哈希表

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        map<int,int>mp;
        mp[0]=1;
        int pre[n+1];
        pre[0]=0;
        int res = 0;
        pre[1]=pre[0]+nums[0];
        for(int i=2;i<=n;i++){
            pre[i]=pre[i-1]+nums[i-1];
            if(mp.find(pre[i]%k)!=mp.end()){
                res+=mp[pre[i]%k];
            }
            mp[pre[i-1]%k]++; // 因为个数限制。
        }
        if(res==0)return false;
        else return true;

    }
};

930. 和相同的二元子数组:前缀和+哈希表

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        map<int,int>mp;
        mp[0]=1;
        int n=nums.size();
        int pre[n+1];
        pre[0]=0;
        int res=0;
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]+nums[i-1];
            if(mp.find(pre[i]-goal)!=mp.end()){
                res+=mp[pre[i]-goal];
            }
            mp[pre[i]]++;           
        }
        return res;

    }
};

904. 水果成篮:滑动窗口+哈希表

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int res = 0;
        int n =fruits.size();
        int right=0,left=0;
        set<int>sc;
        map<int,int>mp;
        for(;right<n;right++){
            sc.insert(fruits[right]);
            mp[fruits[right]]++;
            while(sc.size()>2){
                mp[fruits[left]]--;
                if(mp[fruits[left]]==0)sc.erase(fruits[left]);
                left++;
            }
            res=max(res,right-left+1);
        }
        return res;
    }
};

1]=pre[0]+nums[0];
for(int i=2;i<=n;i++){
pre[i]=pre[i-1]+nums[i-1];
if(mp.find(pre[i]%k)!=mp.end()){
res+=mp[pre[i]%k];
}
mp[pre[i-1]%k]++; // 因为个数限制。
}
if(res==0)return false;
else return true;

}

};






## [930. 和相同的二元子数组](https://leetcode.cn/problems/binary-subarrays-with-sum/):前缀和+哈希表

```c++
class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        map<int,int>mp;
        mp[0]=1;
        int n=nums.size();
        int pre[n+1];
        pre[0]=0;
        int res=0;
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]+nums[i-1];
            if(mp.find(pre[i]-goal)!=mp.end()){
                res+=mp[pre[i]-goal];
            }
            mp[pre[i]]++;           
        }
        return res;

    }
};

904. 水果成篮:滑动窗口+哈希表

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int res = 0;
        int n =fruits.size();
        int right=0,left=0;
        set<int>sc;
        map<int,int>mp;
        for(;right<n;right++){
            sc.insert(fruits[right]);
            mp[fruits[right]]++;
            while(sc.size()>2){
                mp[fruits[left]]--;
                if(mp[fruits[left]]==0)sc.erase(fruits[left]);
                left++;
            }
            res=max(res,right-left+1);
        }
        return res;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化 Kafka 的生产者和消费者

背景 如今&#xff0c;分布式架构已经成为事实上的架构模范&#xff0c;这使得通过 REST API 和 消息中间件来降低微服务之间的耦合变得必然。就消息中间件而言&#xff0c;Apache Kafka 已经普遍存在于如今的分布式系统中。Apache Kafka 是一个强大的、分布式的、备份的消息服…

matplotlib的配色(随机颜色函数,各种渐变色,彩虹色)

也是画图的时候经常会遇到的问题&#xff0c;什么颜色好看&#xff1f; 先直接上一个配色表&#xff1a; plt官网&#xff1a;List of named colors — Matplotlib 3.8.0.dev898g4f5b5741ce documentation 需要什么颜色传入就行了。 例如我下面画一个柱状图&#xff0c;自己选…

云擎未来,智信天下 | 2023移动云大会来了!

新三年&#xff0c;新征程 2023年作为新三年开局之年 移动云又将以怎样的 全新品牌形象、全新战略规划 向“一流云服务商”战略目标勇毅前行&#xff1f; 答案就在这里&#xff1a; 2023移动云大会&#xff0c;官宣定档&#xff01; 2023.4.25 - 4.26 苏州金鸡湖国际会…

Android 中的混音器 AudioMixer 实现分析

Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 AudioMixer&#xff0c;它主要用在 audioflinger 里&#xff0c;用来将多路音频源数据混音&#xff0c;以方便送进音频设备播放出来。 音频混音操作本身…

8.2 正态总体的参数的检验

学习目标&#xff1a; 如果我要学习正态总数的参数检验&#xff0c;我会按照以下步骤进行学习&#xff1a; 学习正态分布的基本知识&#xff1a;正态分布是统计学中非常重要的概率分布之一&#xff0c;掌握其基本知识包括概率密度函数、期望值、方差、标准差等是非常重要的。 …

最佳实践:Android应用中的网络请求和数据缓存

最佳实践&#xff1a;Android应用中的网络请求和数据缓存 网络请求在Android应用中的重要性 在现代移动应用中&#xff0c;网络请求扮演着重要的角色&#xff0c;涉及到数据的获取、上传、更新等功能。网络请求在Android应用中具有关键地位&#xff0c;对于提供优秀的用户体验和…

IDEA配置MAVEN_OPTS

IDEA配置MAVEN_OPTS​ 解决问题 maven MAVEN_OPTS设置 maven编译优化 maven编译速度慢 maven打包编译很慢 maven多线程编译打包 IDEA Maven配置教程​​测试环境:Win10(64位) i7-7700HQ 16GB​​ 参考文章: ​​ ​JVM参数MetaspaceSize的误解​​ Java HotSpot™ 64-Bit Ser…

数字化转型迫在眉睫!药企如何应用AI技术加速创新?

导语 | 近年来&#xff0c;随着 AI 等技术的发展应用&#xff0c;数字化、智能化日渐成为各行各业转型升级的新兴力量&#xff0c;其与医药产业的融合创新也逐渐成为当前的新趋势&#xff0c;众多医药制造企业蓄势待发&#xff0c;搭乘数字化的快车&#xff0c;驶入高速发展的快…

[计算机图形学]几何:网格处理(前瞻预习/复习回顾)

一、前言 网格的三种处理&#xff1a;网格细分&#xff0c;网格简化&#xff0c;网格正则化&#xff0c;细分会产生更多的三角面片来让模型更加光滑&#xff0c;简化则相反会减少网格的三角面片数量&#xff0c;正则化则会让三角形面更加规则。如上图中最右边两幅图&#xff0…

理解C语言中的空指针和野指针

在C语言中&#xff0c;指针是一个非常重要的概念&#xff0c;可以用于操作变量和数据结构。但是&#xff0c;指针也是很容易出错的地方。其中包括两种可能的错误&#xff1a;空指针和野指针。 空指针 空指针指代无效的地址&#xff0c;表示指针不指向内存中的任何一个合法对象…

浏览器便携化操作方法

直接进入主题 如果我们不想把 Chrome 安装进 C 盘&#xff0c;又或者想测试多配置&#xff0c;那么浏览器的便携化就非常重要了。 浏览器便携化的方法有很多&#xff0c;国内常用的有两种。 1、MyChrome MyChrome 最早由网友“甲壳虫”开发&#xff0c;除了浏览器便携化&a…

camunda如何启动一个流程

在 Camunda 中启动一个流程需要使用 Camunda 提供的 API 或者用户界面进行操作。以下是两种常用的启动流程的方式&#xff1a; 1、通过 Camunda 任务列表启动流程&#xff1a;在 Camunda 任务列表中&#xff0c;可以看到已经部署的流程&#xff0c;并可以点击“Start”按钮&am…

【微服务】6、一篇文章学会使用 SpringCloud 的网关

目录 一、网关作用二、网关的技术实现三、简单使用四、predicates(1) 网关路由可配置的内容(2) 路由断言工厂&#xff08;Route Predicate Factory&#xff09; 五、filters(1) GatewayFilter(2) 给全部进入 userservice 的请求添加请求头(3) 全局过滤器 —— GlobalFilter(4) …

如何在矩池云上部署 Carla,模拟自动驾驶

简介 Carla 是一款基于 Python 编写和 UE&#xff08;虚幻引擎&#xff09;的开源仿真器&#xff0c;用于模拟自动驾驶车辆在不同场景下的行为和决策。它提供了高度可定制和可扩展的驾驶环境&#xff0c;包括城市、高速公路和农村道路等。Carla 还提供了丰富的 API 和工具&…

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法 环检测算法(DFS)[207. 课程表](https://leetcode.cn/problems/course-schedule/) 拓扑排序算法(DFS)[210. 课程表 II](https://leetcode.cn/problems/course-schedule-ii/) 环检测算法(BFS)拓扑排序算法(BFS) ⚠申明&#xff1…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已&#xff0c;所携带的cookie往往都不止一个&#xff0c;而是一堆&#xff0c;甚至特别特别长&#xff0c;postman文档提供的cookie操作是全局的&#xff0c;但需要一个一个打&#xff08;折磨&#xff09;&#xff0c;唯一的优点就是作用域…

3.7 曲率

学习目标&#xff1a; 如果我要学习高等数学中的曲率&#xff0c;我会遵循以下步骤&#xff1a; 1.熟悉相关的数学概念&#xff1a;在学习曲率之前&#xff0c;我们需要了解曲线、切线和曲率半径等相关的数学概念。因此&#xff0c;我会复习这些概念&#xff0c;以便更好地理…

Java阶段一Day21

Java阶段一Day21 文章目录 Java阶段一Day21多线程并发原理使用场景创建并启动线程创建线程的方法 进程线程的生命周期获取线程信息的方法 教师总结新单词多线程概念线程:一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。多线程:多个单一顺序执行的…

Nacos 客户端服务注册源码分析-篇二

Nacos 客户端服务注册源码分析-篇二 继续接上回&#xff0c;上回分析到 NacosNamingService 的整个注册的流程&#xff0c;其实是通过 NacosFactory.createNamingService 方法&#xff0c;反射获取 NacosNamingService 接口的实现类 NacosNamingService &#xff0c;而 NacosN…

【计算方法】正交区域查询---KD-Tree概念

一、说明 kd 树是一种二叉树数据结构&#xff0c;可以用来进行高效的 kNN 计算。kd 树算法偏于复杂&#xff0c;本篇将先介绍以二叉树的形式来记录和索引空间的思路&#xff0c;以便读者更轻松地理解 kd 树。 二、正交区域查找 2.1 定义 对于k维空间的张量数据表格&#xff0…