算法【子数组最大累加和问题与扩展】

news2024/11/22 22:00:20

子数组最大累加和问题是一个非常经典的问题,也比较简单。但是扩展出的问题很多,在笔试、面试中特别常见,扩展出的问题很多非常有趣,解法也比较巧妙。

下面通过一些题目来加深理解。

题目一

测试链接:https://leetcode.cn/problems/maximum-subarray/

分析:这是一道常见且较为简单的题,下面给出严格位置依赖和空间压缩的解法。代码如下。

class Solution {
public:
    int dp[100000];
    int maxSubArray(vector<int>& nums) {
        int length = nums.size();
        int ans = nums[0];
        dp[0] = nums[0];
        for(int i = 1;i < length;++i){
            dp[i] = dp[i-1] >= 0 ? dp[i-1] + nums[i] : nums[i];
            ans = ans > dp[i] ? ans : dp[i];
        }
        return dp[length-1];
    }
};

下面是空间压缩的解法。代码如下。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int length = nums.size();
        int cur, last;
        int ans = nums[0];
        last = nums[0];
        for(int i = 1;i < length;++i){
            cur = last >= 0 ? last + nums[i] : nums[i];
            ans = ans > cur ? ans : cur;
            last = cur;
        }
        return ans;
    }
};

题目二

测试链接:https://leetcode.cn/problems/house-robber/

分析:这相当于是一个不能取相邻数的最大数组累加和的题。可以构造二维dp数组dp[i][0]代表以i为结尾,不偷下标为i的房屋的最大金额,dp[i][1]代表以i为结尾,偷下标为i的房屋的最大金额。代码如下。

class Solution {
public:
    int dp[100][2];
    int rob(vector<int>& nums) {
        int length = nums.size();
        int ans = nums[0];
        dp[0][0] = 0;
        dp[0][1] = nums[0];
        for(int i = 1;i < length;++i){
            dp[i][0] = dp[i-1][0] > dp[i-1][1] ? dp[i-1][0] : dp[i-1][1];
            ans = ans > dp[i][0] ? ans : dp[i][0];
            dp[i][1] = dp[i-1][0] + nums[i];
            ans = ans > dp[i][1] ? ans : dp[i][1];
        }
        return ans;
    }
};

下面是空间压缩的解法。代码如下。

class Solution {
public:
    int rob(vector<int>& nums) {
        int length = nums.size();
        int ans = nums[0];
        int last_no = 0, last_yes = nums[0];
        int cur_no, cur_yes;
        for(int i = 1;i < length;++i){
            cur_no = last_no > last_yes ? last_no : last_yes;
            ans = ans > cur_no ? ans : cur_no;
            cur_yes = last_no + nums[i];
            ans = ans > cur_yes ? ans : cur_yes;
            last_no = cur_no;
            last_yes = cur_yes;
        }
        return ans;
    }
};

题目三

测试链接:https://leetcode.cn/problems/maximum-sum-circular-subarray/

分析:对于环形数组求子数组的最大和有两种情况,一种是最大子数组就是非环形数组求最大子数组的结果,另一种是子数组跨过了开头和结尾。对于第一种情况,正常求数组的最大子数组即可。对于第二种情况,只需求数组的最小子数组,然后用数组的总和减去最小子数组。两种情况取最大值即是答案。代码如下。

class Solution {
public:
    int dp1[30001];
    int dp2[30001];
    int maxSubarraySumCircular(vector<int>& nums) {
        int length = nums.size();
        int ans1 = nums[0], ans2 = nums[0], all = nums[0];
        dp1[0] = nums[0];
        dp2[0] = nums[0];
        for(int i = 1;i < length;++i){
            all += nums[i];
            dp1[i] = dp1[i-1] >= 0 ? dp1[i-1] + nums[i] : nums[i];
            ans1 = ans1 > dp1[i] ? ans1 : dp1[i];
            dp2[i] = dp2[i-1] > 0 ? nums[i] : dp2[i-1] + nums[i];
            ans2 = ans2 < dp2[i] ? ans2 : dp2[i];
        }
        return ans2 == all ? ans1 : ans1 > all - ans2 ? ans1 : all - ans2;
    }
};

下面是空间压缩的解法。代码如下。

class Solution {
public:
    int last_1, cur_1;
    int last_2, cur_2;
    int maxSubarraySumCircular(vector<int>& nums) {
        int length = nums.size();
        int ans1 = nums[0], ans2 = nums[0], all = nums[0];
        last_1 = nums[0];
        last_2 = nums[0];
        for(int i = 1;i < length;++i){
            all += nums[i];
            cur_1 = last_1 >= 0 ? last_1 + nums[i] : nums[i];
            ans1 = ans1 > cur_1 ? ans1 : cur_1;
            cur_2 = last_2 > 0 ? nums[i] : last_2 + nums[i];
            ans2 = ans2 < cur_2 ? ans2 : cur_2;
            last_1 = cur_1;
            last_2 = cur_2;
        }
        return ans2 == all ? ans1 : ans1 > all - ans2 ? ans1 : all - ans2;
    }
};

题目四

测试链接:https://leetcode.cn/problems/house-robber-ii/

分析:对于这种环形的情况,依然是分了两种情况,第一种情况是不偷下标为0的房子,第二种情况是偷下标为0的房子。这两种情况最后求出来四个值取最大即是答案。代码如下。

class Solution {
public:
    int dp1[101][2];
    int dp2[101][2];
    int get_max(int a, int b, int c, int d){
        int ans = a;
        ans = ans > b ? ans : b;
        ans = ans > c ? ans : c;
        ans = ans > d ? ans : d;
        return ans;
    }
    int rob(vector<int>& nums) {
        int length = nums.size();
        if(length == 1){
            return nums[0];
        }
        if(length == 2){
            return nums[0] > nums[1] ? nums[0] : nums[1];
        }
        dp1[1][0] = 0;
        dp1[1][1] = nums[1];
        for(int i = 2;i < length;++i){
            dp1[i][0] = dp1[i-1][0] > dp1[i-1][1] ? dp1[i-1][0] : dp1[i-1][1];
            dp1[i][1] = dp1[i-1][0] + nums[i];
        }
        dp2[2][0] = 0;
        dp2[2][1] = nums[2];
        for(int i = 3;i < length-1;++i){
            dp2[i][0] = dp2[i-1][0] > dp2[i-1][1] ? dp2[i-1][0] : dp2[i-1][1];
            dp2[i][1] = dp2[i-1][0] + nums[i];
        }
        return get_max(dp1[length-1][0], dp1[length-1][1], dp2[length-2][0]+nums[0], dp2[length-2][1]+nums[0]);
    }
};

下面是空间压缩的版本。代码如下。

class Solution {
public:
    int last_1_no, last_1_yes, cur_1_no, cur_1_yes;
    int last_2_no, last_2_yes, cur_2_no, cur_2_yes;
    int get_max(int a, int b, int c, int d){
        int ans = a;
        ans = ans > b ? ans : b;
        ans = ans > c ? ans : c;
        ans = ans > d ? ans : d;
        return ans;
    }
    int rob(vector<int>& nums) {
        int length = nums.size();
        if(length == 1){
            return nums[0];
        }
        if(length == 2){
            return nums[0] > nums[1] ? nums[0] : nums[1];
        }
        if(length == 3){
            return nums[0] > nums[1] ? nums[0] > nums[2] ? nums[0] : nums[2] : nums[1] > nums[2] ? nums[1] : nums[2];
        }
        last_1_no = 0;
        last_1_yes = nums[1];
        for(int i = 2;i < length;++i){
            cur_1_no = last_1_no > last_1_yes ? last_1_no : last_1_yes;
            cur_1_yes = last_1_no + nums[i];
            last_1_no = cur_1_no;
            last_1_yes = cur_1_yes;
        }
        last_2_no = 0;
        last_2_yes = nums[2];
        for(int i = 3;i < length-1;++i){
            cur_2_no = last_2_no > last_2_yes ? last_2_no : last_2_yes;
            cur_2_yes = last_2_no + nums[i];
            last_2_no = cur_2_no;
            last_2_yes = cur_2_yes;
        }
        return get_max(last_1_no, last_1_yes, last_2_no+nums[0], last_2_yes+nums[0]);
    }
};

题目五

测试链接:https://leetcode.cn/problems/house-robber-iv/

分析:这道题可以想到二分答案法。因为窃取能力的范围是有限的,只需要使用二分搜索对窃取能力是否能偷盗至少k间房屋进行判断,即可得到最小窃取能力。代码如下。

class Solution {
public:
    int last_no, last_yes, cur_no, cur_yes;
    int f(int ability, vector<int>& nums, int length){
        last_no = 0;
        last_yes = nums[0] <= ability ? 1 : 0;
        for(int i = 1;i < length;++i){
            cur_no = last_no > last_yes ? last_no : last_yes;
            cur_yes = nums[i] <= ability ? last_no + 1 : last_no;
            last_no = cur_no;
            last_yes = cur_yes; 
        }
        return last_no > last_yes ? last_no : last_yes;
    }
    int get_max(vector<int>& nums, int length){
        int ans = nums[0];
        for(int i = 1;i < length;++i){
            ans = ans > nums[i] ? ans : nums[i];
        }
        return ans;
    }
    int minCapability(vector<int>& nums, int k) {
        int length = nums.size();
        int l = 0, r, middle, ans;
        r = get_max(nums, length);
        while (l < r)
        {
            middle = l + (r - l) / 2;
            if(f(middle, nums, length) >= k){
                r = middle - 1;
                ans = middle;
            }else{
                l = middle + 1;
            }
        }
        return ans;
    }
};

题目六

测试链接:https://leetcode.cn/problems/max-submatrix-lcci/

分析:这个就是子数组求最大累加和拓展了一个维度。首先,对于不同数量不同行的组合,在相同下标上的值求和得到一个一维数组。对这个一维数组求子数组最大累加和找到最大的答案记录坐标即可。遍历即可得到答案。代码如下。

class Solution {
public:
    int last, last_start, cur, cur_start, ans, ans_start, ans_end;
    int f(vector<int> &nums, int length){
        last = nums[0];
        last_start = 0;
        ans = nums[0];
        ans_start = 0;
        ans_end = 0;
        for(int i = 1;i < length;++i){
            cur = last > 0 ? last + nums[i] : nums[i];
            cur_start = last > 0 ? last_start : i;
            if(cur > ans){
                ans = cur;
                ans_start = cur_start;
                ans_end = i;
            }
            last = cur;
            last_start = cur_start;
        }
        return ans;
    }
    vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
        int r1, c1, r2, c2;
        vector<int> Ans;
        Ans.assign(4, 0);
        int maxValue = (1 << 31);
        int value;
        int row = matrix.size();
        int column = matrix[0].size();
        int add;
        vector<int> temp;
        temp.assign(column, 0);
        for(int i = 0;i < row;++i){
            for(int j = i;j < row;++j){
                for(int index = 0;index < column;++index){
                    add = 0;
                    for(int begin = i;begin <= j;++begin){
                        add += matrix[begin][index];
                    }
                    temp[index] = add;
                }
                value = f(temp, column);
                if(value > maxValue){
                    maxValue = value;
                    r1 = i;
                    c1 = ans_start;
                    r2 = j;
                    c2 = ans_end;
                }
            }
        }
        Ans[0] = r1;
        Ans[1] = c1;
        Ans[2] = r2;
        Ans[3] = c2;
        return Ans;
    }
};

题目七

测试链接:https://leetcode.cn/problems/maximum-product-subarray/

分析:因为数组中的值有正有负,所以对于dp数组需要求得以下标i为结尾的最大值和最小值。下面直接给出空间压缩的版本。代码如下。

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int last_max, last_min, cur_max, cur_min;
        int length = nums.size();
        int ans = nums[0];
        last_min = nums[0];
        last_max = nums[0];
        for(int i = 1;i < length;++i){
            if(nums[i] == 0){
                cur_max = 0;
                cur_min = 0;
            }else{
                if(nums[i] < 0){
                    cur_max = last_min < 0 ? last_min * nums[i] : nums[i];
                    cur_min = last_max > 0 ? last_max * nums[i] : nums[i];
                }else{
                    cur_max = last_max > 0 ? last_max * nums[i] : nums[i];
                    cur_min = last_min < 0 ? last_min * nums[i] : nums[i];
                }
            }
            ans = ans > cur_max ? ans : cur_max;
            last_max = cur_max;
            last_min = cur_min;
        }
        return ans;
    }
};

题目八

子序列累加和必须被7整除的最大累加和

给定一个非负数组nums

可以任意选择数字组成子序列,但是子序列的累加和必须被7整除

返回最大累加和

分析:dp[i][j]代表以前i个数除以7余数为j的最大累加和。代码如下。

class Solution {
public:
    int dp[10000][7] = {0};
    int get_max(vector<int>& nums) {
        int length = nums.size();
        int cur;
        for(int i = 1;i <= length;++i){
            cur = nums[i-1] % 7;
            for(int j = 0;j < 7;++j){
                dp[i][j] = dp[i-1][j];
                if(cur <= j){
                    dp[i][j] = dp[i][j] > dp[i-1][j-cur] + nums[i-1] ? dp[i][j] : dp[i-1][j-cur] + nums[i-1];
                }else{
                    dp[i][j] = dp[i][j] > dp[i-1][j-cur+7] + nums[i-1] ? dp[i][j] : dp[i-1][j-cur+7] + nums[i-1];
                }
            }
        }
        return dp[length][0];
    }
};

题目九

魔法卷轴

给定一个数组nums,其中可能有正、负、0

每个魔法卷轴可以把nums中连续的一段全变成0

你希望数组整体的累加和尽可能大

卷轴使不使用、使用多少随意,但一共只有2个魔法卷轴

请返回数组尽可能大的累加和

分析:这道题可以将情况拆开来看,对于不使用、使用1次、使用2次分别求出数组累加和,相比较即可得出最大值。不使用时就是简单的求和,使用1次可以看成是求出数组中子数组最小累加和,如果大于等于0,代表数组全部为非负数,故直接返回数组累加和即可;如果最小累加和等于数组累加和,代表数组全是负数,故直接返回0即可。使用2次就需要在找到一个次小累加和,因为次小累加和和最小累加和的范围一定是不重合的,所以对于次小累加和的寻找可以看成是在最小累加和范围之外的左右两边数组中寻找最小累加和,取最小的即可得到次小累加和,如果次小累加和大于等于0,代表只需要使用1次;否则需要使用2次。代码如下。

class Solution {
public:
    int get_max(vector<int>& nums) {
        int all = 0;
        int last, last_start, cur, cur_start;
        int min_value, min_start, min_end;
        int length = nums.size();
        for(int i = 0;i < length;++i){
            all += nums[i];
        }
        min_value = nums[0];
        last = nums[0];
        last_start = 0;
        min_start = 0;
        min_end = 0;
        for(int i = 1;i < length;++i){
            cur = last >= 0 ? last : last + nums[i];
            cur_start = last >= 0 ? i : last_start;
            if(cur < min_value){
                min_value = cur;
                min_start = cur_start;
                min_end = i;
            }
            last = cur;
            last_start = cur_start;
        }
        if(min_value >= 0){
            return all;
        }
        if(min_value == all){
            return 0;
        }
        int minest = min_value;
        int start = 0, end = min_start-1, temp1 = 0, temp2 = 0;
        if(start <= end){
            min_value = nums[start];
            last = nums[start];
            for(int i = start;i <= end;++i){
                cur = last >= 0 ? nums[i] : last + nums[i];
                min_value = min_value < cur ? min_value : cur;
            }
            temp1 = min_value;
        }
        start = min_end+1;
        end = length-1;
        if(start <= end){
            min_value = nums[start];
            last = nums[start];
            for(int i = start;i <= end;++i){
                cur = last >= 0 ? nums[i] : last + nums[i];
                min_value = min_value < cur ? min_value : cur;
            }
            temp2 = min_value;
        }
        int tmp = temp1 < temp2 ? temp1 : temp2;
        if(tmp >= 0){
            return all - minest;
        }
        return all - minest - tmp;
    }
};

题目十

测试链接:https://leetcode.cn/problems/maximum-sum-of-3-non-overlapping-subarrays/

分析:这道题思路是构造前缀后缀信息,在数组中截取一个长度为k的子数组,然后用前缀信息和后缀信息求得3个子数组的和,遍历数组即可求得最大值。prefix[i]代表以下标i结尾时长度为k的最大累加和子数组的开始下标,suffix[i]代表以下标i为开头时长度为k的最大累加和子数组的开始下标。代码如下。

class Solution {
public:
    int Sum[20001];
    int prefix[20001];
    int suffix[20001];
    vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
        int length = nums.size();
        int window = 0;
        int ans = 0;
        vector<int> Ans;
        Ans.assign(3, 0);
        int index1, index2, index3;
        for(int i = 0;i < k;++i){
            window += nums[i];
        }
        Sum[0] = window;
        for(int i = 1;i < length-k+1;++i){
            window -= nums[i-1];
            window += nums[i+k-1];
            Sum[i] = window;
        }
        prefix[k-1] = 0;
        for(int i = k;i < length-k+1;++i){
            prefix[i] = Sum[prefix[i-1]] >= Sum[i-k+1] ? prefix[i-1] : i-k+1;
        }
        suffix[length-k] = length-k;
        for(int i = length-k-1;i >= 0;--i){
            suffix[i] = Sum[suffix[i+1]] > Sum[i] ? suffix[i+1] : i;
        }
        for(int i = k;i < length-2*k+1;++i){
            if(ans < Sum[i] + Sum[prefix[i-1]] + Sum[suffix[i+k]]){
                ans = Sum[i] + Sum[prefix[i-1]] + Sum[suffix[i+k]];
                index1 = prefix[i-1];
                index2 = i;
                index3 = suffix[i+k];
            }
        }
        Ans[0] = index1;
        Ans[1] = index2;
        Ans[2] = index3;
        return Ans;
    }
};

题目十一

可以翻转1次的情况下子数组最大累加和

给定一个数组nums

现在允许你随意选择数组连续一段进行翻转,也就是子数组逆序的调整

比如翻转[1,2,3,4,5,6]的[2~4]范围,得到的是[1,2,5,4,3,6]

返回必须随意翻转1次之后,子数组的最大累加和

分析:可以看出,翻转其实是选定一个边界,边界左边的进行翻转,边界右边的不动,或者左边不动右边翻转。这样只需要得到边界左边以边界为结尾的子数组最大累加和以及边界右边以边界为开头的子数组最大累加和,相加即是这个边界的答案。遍历数组即可得到子数组的最大累加和。代码如下。

class Solution {
public:
    int get_reverse_max(vector<int>& nums) {
        int dp1[10000] = {0};
        int dp2[10000] = {0};
        int ans;
        int length = nums.size();
        dp1[0] = nums[0];
        for(int i = 1;i < length;++i){
            dp1[i] = dp1[i-1] > 0 ? dp1[i-1] + nums[i] : nums[i];
        }
        dp2[length-1] = nums[length-1];
        for(int i = length-2;i >= 0;--i){
            dp2[i] = dp2[i+1] > 0 ? dp2[i+1] + nums[i] : nums[i];
        }
        ans = dp2[0];
        int front_max = dp1[0];
        for(int i = 1;i < length;++i){
            front_max = front_max > dp1[i-1] ? front_max : dp1[i-1];
            ans = ans > front_max + dp2[i] ? ans : front_max + dp2[i];
        }
        return ans;
    }
};

题目十二

删掉1个数字后长度为k的子数组最大累加和

给定一个数组nums,求必须删除一个数字后的新数组中

长度为k的子数组最大累加和,删除哪个数字随意

分析:这道题可以理解为,对于每一个长度为k+1的子数组,删除这这个子数组中的最小值,从每一个长度为k+1的子数组中求得结果。因为子数组要减去子数组范围内的最小值,所以可以采用单调队列。代码如下。

class Solution {
public:
    int get_delete1_max(vector<int>& nums, int k) {
        int length = nums.size();
        if(length <= k){
            return 0;
        }
        vector<int> window;
        window.assign(length, 0);
        int l = 0;
        int r = 0;
        long sum = 0;
        int ans = (1 << 31);
        for(int i = 0;i < length;++i){
            while (l < r && nums[window[r-1]] >= nums[i])
            {
                --r;
            }
            window[r++] = i;
            sum += nums[i];
            if(i >= k){
                ans = ans > sum - nums[window[l]] ? ans : sum - nums[window[l]];
                if(window[l] == i-k){
                    ++l;
                }
                sum -= nums[i-k];
            }
        }
        return ans;
    }
};

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

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

相关文章

容器安全检测和渗透测试工具

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect Docker-bench-…

Day10_CSS过度动画

Day10_CSS过度动画 背景 : PC和APP项目我们已经开发完毕, 但是再真正开发的时候有些有些简易的动态效果我们可以使用CSS完成 ; 本节课我们来使用CSS完成基础的动画效果 今日学习目标 CSS3过度CSS3平面动态效果CSS3动画效果案例 1. CSS3过渡 ​ 含义 :过渡指的是元素从一种…

iOS应用网络安全之HTTPS

移动互联网开发中iOS应用的网络安全问题往往被大部分开发者忽略, iOS9和OS X 10.11开始Apple也默认提高了安全配置和要求. 本文以iOS平台App开发中对后台数据接口的安全通信进行解析和加固方法的分析. 1. HTTPS/SSL的基本原理 安全套接字层 (Secure Socket Layer, SSL) 是用来…

excel版数独游戏(已完成)

前段时间一个朋友帮那小孩解数独游戏&#xff0c;让我帮解&#xff0c;我看他用电子表格做&#xff0c;只能显示&#xff0c;不能显示重复&#xff0c;也没有协助解题功能&#xff0c;于是我说帮你做个电子表格版的“解题助手”吧&#xff0c;不能直接解题&#xff0c;但该有的…

金融数据中心容灾“大咖说” | 美创科技赋能“灾备一体化”建设

中国人民银行发布的《金融数据中心容灾建设指引》&#xff08;JR/T 0264—2024&#xff09;已于2024年7月29日正式实施。这一金融行业标准对金融数据中心容灾建设中的“组织保障、需求分析、体系规划、建设要求、运维管理”进行了规范和指导。面对不断增加的各类网络、业务、应…

Qt:信号槽

一. 信号槽概念 信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号&#xff0c;另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt 的核心特性之一&#xff0c;提供了一种灵活且类型安全的方式来处理事件和数据传递。 1. 信号的本质 QT中&a…

SpringBoot与MongoDB深度整合及应用案例

SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域&#xff0c;NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB&#xff0c;作为一款领先的NoSQL数据库&#xff0c;以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…

ThinkPHP6门面(Facade)

门面 门面&#xff08;Facade&#xff09; 门面为容器中的&#xff08;动态&#xff09;类提供了一个静态调用接口&#xff0c;相比于传统的静态方法调用&#xff0c; 带来了更好的可测试性和扩展性&#xff0c;你可以为任何的非静态类库定义一个facade类。 系统已经为大部分…

MySQL win安装 和 pymysql使用示例

目录 一、MySQL安装 下载压缩包&#xff1a; 编写配置文件&#xff1a; 配置环境变量&#xff1a; 初始化服务和账户 关闭mysql开机自启&#xff08;可选&#xff09; 建议找一个数据库可视化软件 二、使用pymysql操作数据库 安装pymysql 示例代码 报错处理 一、My…

Parker派克防爆电机在实际应用中的安全性能如何保证?

Parker防爆电机确保在实际应用中的安全性能主要通过以下几个方面来保证&#xff1a; 1.防爆外壳设计&#xff1a;EX系列电机采用强大的防爆外壳&#xff0c;设计遵循严格的防爆标准&#xff0c;能够承受内部可能发生的爆炸而不破损&#xff0c;利用间隙切断原理&#xff0c;防…

空间与单细胞转录组学的整合定位肾损伤中上皮细胞与免疫细胞的相互作用

result 在空间转录组图谱中对人类肾脏进行无监督映射和细胞类型鉴定 我们试图在H&E染色的人类参考肾切除标本组织切片上直接映射转录组特征。该组织来自一名59岁的女性&#xff0c;其肾小球闭塞和间质纤维化程度最低&#xff08;分别影响不到10%的肾小球或肾实质&#xff…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…

详细描述一下Elasticsearch索引文档的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch索引文档的过程&#xff1f; Elasticsearch的索引文档过程是其核心功能之一&#xff0c;涉及将数据存储到…

入门车载以太网(6) -- XCP on Ethernet

目录 1.寻址方式 2.数据帧格式 3.特殊指令 4.使用实例 了解了SOME/IP之后&#xff0c;继续来看看车载以太网在汽车标定领域的应用。 在汽车标定领域XCP是非常重要的协议&#xff0c;咱们先来回顾下基础概念。 XCP全称Universal Measurement and Calibration Protocol&a…

Python中常用的函数介绍

Python中常用的几种函数 1、input函数 input()函数&#xff1a;主要作用是让用户输入某个内容并接收它。 #输入你的年龄 >>> age input("my age is :") my age is :20 执行代码后输入年龄&#xff0c;年龄被存放到age变量中&#xff0c;执行print后终端会…

Ubuntu从入门到精通(二)远程和镜像源配置齐全

Ubuntu从入门到精通(二) 1 常见操作配置 1.1 英文语言配置 1.1.1 打开设置 1.1.2 设置语言为英文 1.1.3 重启生效 1.1.4 再次进入,选择更新名字 1.1.5 再次进入,发现已经变成了英文 1.2 输入法配置 1.3 rustdesk安装 1.3.1 Windows系统配置 登陆:https://github.com…

卷积神经网络(CNN)中的池化层(Pooling Layer)

池化层&#xff08;Pooling Layer&#xff09;&#xff0c;也被称为下采样层&#xff0c;是深度学习神经网络中常用的一种层级结构。它通常紧跟在卷积层之后&#xff0c;对卷积层输出的特征图进行下采样操作。 一、定义与功能 池化层的主要作用是通过减少特征图的尺寸来降低计算…

【linux硬件操作系统】计算机硬件常见硬件故障处理

这里写目录标题 一、故障排错的基本原则二、硬件维护注意事项三、关于最小化和还原出厂配置四、常见故障处理及调试五、硬盘相关故障六、硬盘相关故障&#xff1a;硬盘检测问题七、硬盘相关故障&#xff1a;自检硬盘报错八、硬盘相关故障&#xff1a;硬盘亮红灯九、硬盘相关故障…

《操作系统》实验内容 实验二 编程实现进程(线程)同步和互斥(Python 与 PyQt5 实现)

实验内容 实验二 编程实现进程&#xff08;线程&#xff09;同步和互斥 1&#xff0e;实验的目的 &#xff08;1&#xff09;通过编写程序实现进程同步和互斥&#xff0c;使学生掌握有关进程&#xff08;线程&#xff09;同步与互斥的原理&#xff0c;以及解决进程&#xf…