算法沉淀——分治算法(leetcode真题剖析)

news2024/11/30 0:38:59

在这里插入图片描述

算法沉淀——分治算法

  • 快排思想
    • 01.颜色分类
    • 02.排序数组
    • 03.数组中的第K个最大元素
    • 04.库存管理 III
  • 归并思想
    • 01.排序数组
    • 02.交易逆序对的总数
    • 03.计算右侧小于当前元素的个数
    • 04.翻转对

分治算法是一种解决问题的算法范式,其核心思想是将一个大问题分解成若干个小问题,递归地解决这些小问题,最后将它们的解合并起来得到原问题的解。分治算法的一般步骤包括分解(Divide)、解决(Conquer)、合并(Combine)。

具体来说,分治算法包含以下几个步骤:

  1. 分解(Divide): 将原问题分解成若干个规模较小、相互独立的子问题。这一步通常是问题规模的减小或者数据规模的缩小。
  2. 解决(Conquer): 递归地解决这些子问题。对于规模较小的子问题,可以直接求解。
  3. 合并(Combine): 将子问题的解合并起来,得到原问题的解。

分治算法通常适用于能够被划分成相互独立子问题的问题,并且这些子问题的结构和原问题一样。经典的分治算法有许多,如归并排序、快速排序、二分搜索等。

经典例子:归并排序

  1. 分解(Divide): 将待排序的数组分成两半。
  2. 解决(Conquer): 对每个子数组进行归并排序,递归地进行排序。
  3. 合并(Combine): 合并已排序的子数组,得到最终的排序结果。

分治算法的优点包括:

  • 模块化设计: 将问题分解成小问题,使得算法结构清晰,易于理解和实现。
  • 可并行性: 分治算法通常适用于并行计算,因为子问题可以独立地求解。
  • 适用范围广: 适用于一类问题,如排序、查找等。

快排思想

01.颜色分类

题目链接:https://leetcode.cn/problems/sort-colors/

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 012 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i]012

思路

具体的思路可以分为以下三个部分:

  1. 红色部分(0): 通过交换,保证红色元素的右边界 left 的左侧都是红色元素。初始时,left 设置为-1。
  2. 白色部分(1): 遍历过程中,遇到白色元素(1)时,直接将指针 i 向右移动,不进行交换。白色元素已经排列在红色元素的右侧,所以不需要额外操作。
  3. 蓝色部分(2): 通过交换,保证蓝色元素的左边界 right 的右侧都是蓝色元素。初始时,right 设置为数组的长度。

整个过程在遍历指针 i 小于右边界 right 的情况下进行。当 iright 相遇时,排序完成。

代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        for(int i=0,left=-1,right=nums.size();i<right;){
            if(nums[i]==0) swap(nums[++left],nums[i++]);
            else if(nums[i]==1) i++;
            else swap(nums[i],nums[--right]);
        }
    }
};

02.排序数组

题目链接:https://leetcode.cn/problems/sort-an-array/

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

思路

普通快排在这里是通过不了的,所以我们可以使用上面颜色分类的思想进行三路划分的优化

三路划分是对传统快速排序算法的一种改进,通过将数组划分为三个部分:小于、等于、大于基准值,从而在存在大量相同元素的情况下,提高了性能。

传统快速排序在处理有大量相同元素的数组时可能会导致不均匀的划分,使得递归树不平衡,进而影响性能。三路划分通过在划分过程中将数组分为小于、等于、大于基准值的三个部分,有效地解决了这一问题,具有以下优势:

  1. 减少重复元素的递归处理: 在存在大量相同元素的情况下,传统快速排序可能导致递归深度较大,而三路划分能够将相同元素聚集在一起,从而减少递归深度。
  2. 避免不必要的交换: 在传统快速排序中,可能会进行多次相同元素的交换,而三路划分通过将相同元素聚集在一起,避免了不必要的交换操作,提高了性能。
  3. 适用于含有大量重复元素的场景: 当数组中存在大量相同元素时,三路划分能够更好地利用重复元素的信息,提高排序效率。

三路划分的核心思想是通过一个循环,将数组划分为小于、等于、大于基准值的三个部分。这样,相同元素被聚集在等于基准值的部分,从而在递归过程中能够更高效地处理重复元素。这一优化使得算法在处理包含大量相同元素的数组时,性能更为稳定。

代码

class Solution {
public:
    int getRandom(vector<int>& nums,int left, int right){
        return nums[rand()%(right-left+1)+left];
    }
    
    void qsort(vector<int>& nums,int l, int r){
        if(l>=r) return;

        int key=getRandom(nums,l,r);
        int i=l,left=l-1,right=r+1;
        while(i<right){
            if(nums[i]<key) swap(nums[++left],nums[i++]);
            else if(nums[i]==key) i++;
            else swap(nums[--right],nums[i]);
        }

        qsort(nums,l,left);
        qsort(nums,right,r);
    }

    vector<int> sortArray(vector<int>& nums) {
        srand(time(NULL));
        qsort(nums,0,nums.size()-1);
        return nums;
    }
};

03.数组中的第K个最大元素

题目链接:https://leetcode.cn/problems/kth-largest-element-in-an-array/

给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

思路

这里最常规的写法应该是使用堆排,但是这样达不到O(n)的时间复杂度,所以这里我们结合快排中的三路划分思想

代码

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(NULL));  // 设置随机数种子
        return qsort(nums, 0, nums.size() - 1, k);
    }

    int qsort(vector<int>& nums, int l, int r, int k) {
        if (l == r) return nums[l];

        // 1. 随机选择基准元素
        int key = getRandom(nums, l, r);

        // 2. 根据基准元素将数组分为三块
        int left = l - 1, right = r + 1, i = l;
        while (i < right) {
            if (nums[i] < key) {
                swap(nums[++left], nums[i++]);
            } else if (nums[i] == key) {
                i++;
            } else {
                swap(nums[--right], nums[i]);
            }
        }

        // 3. 分情况讨论
        int c = r - right + 1, b = right - left - 1;
        if (c >= k) {
            // 第 k 大元素在右侧部分
            return qsort(nums, right, r, k);
        } else if (b + c >= k) {
            // 第 k 大元素等于基准元素
            return key;
        } else {
            // 第 k 大元素在左侧部分
            return qsort(nums, l, left, k - b - c);
        }
    }

    int getRandom(vector<int>& nums, int left, int right) {
        return nums[rand() % (right - left + 1) + left];
    }
};
  1. 计算左、右和基准三个部分的元素个数:
    • c 表示右侧部分元素的个数,即大于基准元素的个数。
    • b 表示基准元素左侧部分元素的个数,即等于基准元素的个数。
  2. 判断第 k 大元素的位置:
    • 如果右侧部分元素个数 c 大于等于 k,说明第 k 大元素在右侧部分。因此,递归地在右侧部分中继续寻找第 k 大元素。
    • 如果 b + c 大于等于 k,说明第 k 大元素等于基准元素。此时,基准元素即为所求的第 k 大元素,直接返回基准元素的值。
    • 如果以上两个条件都不满足,说明第 k 大元素在左侧部分。因此,递归地在左侧部分中继续寻找第 k 大元素,同时将 k 减去右侧和基准元素的个数。

这样的划分和递归过程保证了在不同情况下都能正确地找到第 k 大元素,从而完成整个算法。这是随机化快速排序在选择第 k 大元素时的一种处理策略,通过考虑基准元素左右两侧的元素个数,提高了算法在寻找第 k 大元素时的效率。

04.库存管理 III

题目链接:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1:

输入:stock = [2,5,7,4], cnt = 1
输出:[2]

示例 2:

输入:stock = [0,2,3,6], cnt = 2
输出:[0,2] 或 [2,0]

提示:

  • 0 <= cnt <= stock.length <= 10000 0 <= stock[i] <= 10000

思路

这一题和上一题的思路基本一致,同样我们使用快速选择的算法,可以使时间复杂度达到O(n),只不过需要简单做一些调整

代码

class Solution {
public:
    void qsort(vector<int>& nums, int l, int r, int k) {
        if (l >= r) return;

        // 随机选择基准元素
        int key = nums[rand() % (r - l + 1) + l];
        int left = l - 1, right = r + 1, i = l;
        
        // 划分过程
        while (i < right) {
            if (nums[i] < key) {
                swap(nums[++left], nums[i++]);
            } else if (nums[i] == key) {
                i++;
            } else {
                swap(nums[--right], nums[i]);
            }
        }

        int a = left - l + 1, b = right - left - 1;

        // 根据划分情况递归处理
        if (a > k) {
            // 第 k 小元素在左侧部分
            qsort(nums, l, left, k);
        } else if (a + b >= k) {
            // 第 k 小元素在基准元素右侧,且可能包含部分基准元素
            return;
        } else {
            // 第 k 小元素在右侧部分
            qsort(nums, right, r, k - a - b);
        }
    }

    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
        srand(time(NULL));

        // 调用随机化快速排序
        qsort(stock, 0, stock.size() - 1, cnt);

        // 返回前 cnt 小的商品
        return {stock.begin(), stock.begin() + cnt};
    }
};

归并思想

01.排序数组

题目链接:https://leetcode.cn/problems/sort-an-array/

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

思路

要理解分治中的归并思想,首先我们从归并排序入手,这里我直接编写代码,想看更清晰的排序剖析,可以翻看博主之前关于八大排序的博客

代码

class Solution {
    vector<int> tmp;
public:
    vector<int> sortArray(vector<int>& nums) {
        tmp.resize(nums.size());
        mergeSort(nums, 0, nums.size() - 1);
        return nums;
    }

    void mergeSort(vector<int>& nums, int left, int right) {
        if (left >= right) return;

        // 计算中间位置
        int mid = (right + left) >> 1;

        // 递归对左右两部分进行归并排序
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);

        // 归并合并两个有序部分
        int cur1 = left, cur2 = mid + 1, i = 0;
        while (cur1 <= mid && cur2 <= right)
            tmp[i++] = (nums[cur1] <= nums[cur2]) ? nums[cur1++] : nums[cur2++];
        while (cur1 <= mid) tmp[i++] = nums[cur1++];
        while (cur2 <= right) tmp[i++] = nums[cur2++];

        // 将归并后的结果拷贝回原数组
        for (int i = left; i <= right; ++i)
            nums[i] = tmp[i - left];
    }
};

02.交易逆序对的总数

题目链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

示例 1:

输入:record = [9, 7, 5, 4, 6]
输出:8
解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。 

限制:

0 <= record.length <= 50000

思路

这里我们使用归并的思想可以对数组边排序边进行逆序对的计算,我们在进行归并排序划分时,左边和右边都是相对有序的,我们在归并时,找到了左边相对右边大的那个数,就可以进行一次逆序对的组合,即此时左边被遍历的数及其之后的数都能和此时右边的数进行逆序匹配,此时我们累加逆序对的值,直到我们把整个数组归并完毕,逆序对的总数也就计算完毕了

代码

class Solution {
    int tmp[50000];
public:
    int reversePairs(vector<int>& record) {
        return mergeSort(record, 0, record.size() - 1);
    }

    int mergeSort(vector<int>& nums, int left, int right) {
        if (left >= right) return 0;
        int ret = 0;
        int mid = (left + right) >> 1;

        // 递归对左右两部分进行归并排序
        ret += mergeSort(nums, left, mid);
        ret += mergeSort(nums, mid + 1, right);

        // 归并合并两个有序部分,并统计逆序对个数
        int cur1 = left, cur2 = mid + 1, i = 0;
        while (cur1 <= mid && cur2 <= right) {
            if (nums[cur1] <= nums[cur2]) {
                tmp[i++] = nums[cur1++];
            } else {
                ret += mid - cur1 + 1;  // 统计逆序对个数
                tmp[i++] = nums[cur2++];
            }
        }
        while (cur1 <= mid) tmp[i++] = nums[cur1++];
        while (cur2 <= right) tmp[i++] = nums[cur2++];

        // 将归并后的结果拷贝回原数组
        for (int i = left; i <= right; ++i)
            nums[i] = tmp[i - left];

        return ret;
    }
};

03.计算右侧小于当前元素的个数

题目链接:https://leetcode.cn/problems/count-of-smaller-numbers-after-self/

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

示例 1:

输入:nums = [5,2,6,1]
输出:[2,1,1,0] 
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

示例 2:

输入:nums = [-1]
输出:[0]

示例 3:

输入:nums = [-1,-1]
输出:[0,0]

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

思路

我们可以继续利用上面的逆序对思想,只不过我们需要使用额外的数组来记录相对下标。

代码

class Solution {
    vector<int> ret;
    vector<int> index;
    int tmp[500000];
    int tindex[500000];
public:
    vector<int> countSmaller(vector<int>& nums) {
        int n=nums.size();
        ret.resize(n);
        index.resize(n);

        for(int i=0;i<n;i++)  index[i]=i;

        mergeSort(nums,0,n-1);
        return ret;
    }

    void mergeSort(vector<int>& nums,int left,int right){
        if(left>=right) return;

        int mid=(left+right)>>1;
        mergeSort(nums,left,mid);
        mergeSort(nums,mid+1,right);

        int cur1=left,cur2=mid+1,i=0;
        while(cur1<=mid&&cur2<=right){
            if(nums[cur1]<=nums[cur2]){
                tmp[i]=nums[cur2];
                tindex[i++]=index[cur2++];
            }
            else{
                ret[index[cur1]]+=right-cur2+1;
                tmp[i]=nums[cur1];
                tindex[i++]=index[cur1++];
            }
        }

        while(cur1<=mid){
            tmp[i]=nums[cur1];
            tindex[i++]=index[cur1++];
        }
        while(cur2<=right){
            tmp[i]=nums[cur2];
            tindex[i++]=index[cur2++];
        }
        for(int j=left;j<=right;j++){
            nums[j]=tmp[j-left];
            index[j]=tindex[j-left];
        }
    }
};

04.翻转对

题目链接:https://leetcode.cn/problems/reverse-pairs/

给定一个数组 nums ,如果 i < jnums[i] > 2*nums[j] 我们就将 (i, j) 称作一个*重要翻转对*

你需要返回给定数组中的重要翻转对的数量。

示例 1:

输入: [1,3,2,3,1]
输出: 2

示例 2:

输入: [2,4,3,5,1]
输出: 3

注意:

  1. 给定数组的长度不会超过50000
  2. 输入数组中的所有数字都在32位整数的表示范围内。

思路

总体思路依旧是使用归并,我们在每次排序前,找到当前的左边某个数大于右边的两倍,即可一次性计算该数后面的翻转对个数,数组排序完成,即可计算全部的翻转对

代码

class Solution {
    int tmp[50000];
public:
    int reversePairs(vector<int>& nums) {
        return mergeSort(nums,0,nums.size()-1);
    }

    int mergeSort(vector<int>& nums,int left,int right){
        if(left>=right) return 0;
        int ret=0;
        int mid=(left+right)>>1;

        ret+=mergeSort(nums,left,mid);
        ret+=mergeSort(nums,mid+1,right);

        int cur1=left,cur2=mid+1,i=left;
        while(cur1<=mid){
            while(cur2<=right&&nums[cur2]>=nums[cur1]/2.0) cur2++;

            if(cur2>right) break;
            ret+=right-cur2+1;
            cur1++;
        }

        cur1=left,cur2=mid+1;
        while(cur1<=mid&&cur2<=right) 
            tmp[i++]=nums[cur1]<=nums[cur2]?nums[cur2++]:nums[cur1++];
        while(cur1<=mid) tmp[i++]=nums[cur1++];
        while(cur2<=right) tmp[i++]=nums[cur2++];

        for(int j=left;j<=right;j++)
            nums[j]=tmp[j];
        return ret;
    }
};

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

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

相关文章

计算机二级C语言的注意事项及相应真题-4-程序修改

目录&#xff1a; 31.逐个比较p、q所指两个字符串对应位置中的字符&#xff0c;把ASCII值大或相等的字符依次存放到c所指数组中&#xff0c;形成一个新的字符串32.求矩阵&#xff08;二维数组)a[N][N]中每行的最小值&#xff0c;结果存放到数组b中33.将一个十进制整数转换成r(二…

力扣刷题54-螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,…

我让ChatGPT帮我钓妹子,它一口气撩了5000人

来自俄罗斯的一名AI开发者、社交平台TenChat的产品经理 AleksandrZhadan于1月30日在推特上发布了自己的婚讯&#xff0c;他将要与自己的女友Karina Imranovna在今年的8月结婚。令人震惊的是Aleksandr Zhadan介绍的认识女友的窍门-ChatGPT 帮他找到了另一半&#xff0c;并且通过…

springsecurity6使用

spring security 中的类 &#xff1a; AuthenticationManager : 实现类&#xff1a;ProviderManager 管理很多的 provider &#xff0c;&#xff0c;&#xff0c; 经常使用的&#xff0c;DaoAuthenticationProvider , 这个要设置一个 UserDetailService , 查找数据库&#xff…

【ES6】Promise

Promise 回调地狱 const fs require(fs);fs.readFile(./a.txt, utf-8, (err, data) > {if(err) throw err;console.log(data);fs.readFile(./b.txt, utf-8, (err, data) > {if(err) throw err;console.log(data);fs.readFile(./c.txt, utf-8, (err, data) > {if(er…

斯巴鲁Subaru EDI需求分析

斯巴鲁Subaru是日本运输集团斯巴鲁公司&#xff08;前身为富士重工&#xff09;的汽车制造部门&#xff0c;以性能而闻名&#xff0c;曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接&#xff0c;首先需要确…

MQTT的学习与应用

文章目录 一、什么是MQTT二、MQTT协议特点三、MQTT应用领域四、安装Mosquitto五、如何学习 MQTT 一、什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;设计用于在低带宽、不稳定的网络环境中进行高效的通信…

ITK 图像分割(一):阈值ThresholdImageFilter

效果&#xff1a; 1、itkThresholdImageFilter 该类的主要功能是通过设置低阈值、高阈值或介于高低阈值之间&#xff0c;则将图像值输出为用户指定的值。 如果图像值低于、高于或介于设置的阈值之间&#xff0c;该类就将图像值设置为用户指定的“外部”值&#xff08;默认情况…

基于JAVA的新能源电池回收系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

联合体与枚举

联合体与枚举 联合体枚举问题 联合体 联合体也是由一个或多个成员构成的数据类型,它最大的特点是只为最大的一个成员开辟空间,其他成员共用这个空间,这个东西也叫共用体!!! union Un {char c;int i; };int main() {union Un un { 0 };un.c 0x01;//先为最大的成员开辟空间un.…

STM32单片机的基本原理与应用(七)

超声波测距实验 基本原理 超声波测距实验是STM32单片机通过控制HC-SR04超声波模块&#xff0c;使其发送超声波&#xff0c;遇到物体反射回超声波来实现距离测量&#xff0c;其原理就是在发射超声波到接收超声波会有一段时间&#xff0c;而超声波在空气中传播的速度为声速&…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-动态内存

目录 一、动态内存运行机制二、动态内存开发流程三、动态内存使用说明四、动态内存核心算法五、动态内存接口六、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、动态内存运行机制 动态内存管理&#xff0c;即在内存资源充足的情况下&#xff0c;根据用户需求&…

单个摄像头(单目RGB)实时3D手的跟踪

概述&#xff1a; 通过单个普通RGB摄像头就可以实现3D手的实时跟踪。 来自论文&#xff1a; GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB 官网地址如下链接&#xff1a; GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB 应用…

Linux_环境变量_命令行参数

一.环境变量 在Linux中自己写的程序必须要带路径才能运行&#xff0c;相对路径或是绝对路径&#xff0c;但是像ls pwd这样的程序&#xff0c;不带路径也能运行。当你想要运行一个程序时&#xff1a; 如果带有路径的话&#xff0c;则直接将对应路径的程序加载进内存&#xff0…

Linux入门(1)Linux介绍

目录 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 2. 学会如何使用云服务器 3. 掌握使用远程终端工具 xshell 登陆 Linux 服务器 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 学习Linux系统编程&#xff0c;你可能要问Linux从哪里来&#xff1f;它是怎么发展的&am…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中&#xff0c;安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时&#xff0c;保护用户信息的安全性是非常重要…

vue-组件组成和组件通信(四)

组件的三大组成部分 (结构/样式/逻辑) scoped样式冲突 默认情况&#xff1a;写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式: 默认组件中的样式会作用到全局 2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组…

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection 1 实现尺度不变性 不管多近多远&#xff0c;多大多小都能检测出来 找到一个函数&#xff0c;实现尺度的选择特性 2 高斯偏导模版求边缘 做卷积 3 高斯二阶导拉普拉斯 看哪个信号能产生最大响应 高斯…

TinUI v5预发布记录

TinUI v5预发布记录 前言新控件滚动选择框菜单按钮 新样式pre1pre2pre3 新功能导入字体文件 前言 TinUI是一个从2021年正式开始并一直维护到现在的小项目&#xff0c;中间经过了四代版本的更新。因为一些原因&#xff0c;2023年&#xff0c;TinUI-4后更新较少。 TinUI发展历程…

【MATLAB】小波神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波神经网络回归预测算法是一种利用小波变换和人工神经网络相结合的方法&#xff0c;用于解决回归预测问题。下面将详细介绍该算法的原理与方法&#xff1a; 小波变换&#xff1a; 小波变…