【算法專題】分治 - 快速排序

分治 - 快速排序

  • 分治 - 快速排序
    • 1. 顏色分類
    • 2. 排序數組(快速排序)
    • 3. 數組中的第K個最大元素
    • 4. 庫存管理Ⅲ
    • 5. 排序數組(歸并排序)
    • 6. 交易逆序對的總數
    • 7. 計算右側小于當前元素的個數
    • 8. 翻轉對

分治 - 快速排序

1. 顏色分類

做題鏈接 -> Leetcode -75.顏色分類

題目:給定一個包含紅色、白色和藍色、共 n 個元素的數組 nums ,原地對它們進行排序,使得相同顏色的元素相鄰,并按照紅色、白色、藍色順序排列。
我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
必須在不使用庫內置的 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] 為 0、1 或 2

思路:快排思想,三指針法使數組分三塊。類比數組分兩塊的算法思想,這里是將數組分成三塊,那么我們可以再添加?個指針,實現數組分三塊。

設數組大小為 n ,定義三個指針 left, cur, right :

  • left :用來標記 0(紅色) 序列的末尾,因此初始化為 -1 ;
  • cur :用來掃描數組,初始化為 0 ;
  • right :用來標記 2(藍色) 序列的起始位置,因此初始化為 n 。

在 cur 往后掃描的過程中,保證:

  • [0, left] 內的元素都是 0(紅色) ;
  • [left + 1, cur - 1] 內的元素都是 1(白色) ;
  • [cur, right - 1] 內的元素是待定元素;
  • [right, n] 內的元素都是 2(藍色) .

代碼如下:

		class Solution {public:void sortColors(vector<int>& nums) {// 使用三指針將數組分為三塊,最終分為以下三個模塊:// [0, left] 表示 0(紅色) 序列;// [left + 1, right - 1] 表示 1(白色) 序列;// [right, numsSize - 1] 表示 2(藍色) 序列。     int cur = 0, left = -1, right = nums.size();while(cur < right){if(nums[cur] == 0) swap(nums[++left], nums[cur++]);else if(nums[cur] == 1) cur++;else swap(nums[--right], nums[cur]);}}};

2. 排序數組(快速排序)

做題鏈接 -> Leetcode -912.排序數組

題目:給你一個整數數組 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 * 10^4
5 * 10^4 <= nums[i] <= 5 * 10^4

由于思路比較明顯,使用快速選擇算法,遞歸處理選取一個基準值 key 將數組分為三塊,下面直接看代碼:

		class Solution {public:vector<int> sortArray(vector<int>& nums) {// 種下一個隨機數種子srand(time(nullptr));// 快速選擇算法,將數組劃分為三個區間my_qsort(nums, 0, nums.size() - 1);return nums;}void my_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[i], nums[--right]);else if(nums[i] == key) ++i;else swap(nums[++left], nums[i++]);}// [l, left] [left + 1, right - 1] [right, r]my_qsort(nums, l, left);my_qsort(nums, right, r);}// 獲取數組中隨機一個數// 讓隨機數 % 上區間大小,然后加上區間的左邊界int getRandom(vector<int>& nums, int left, int right){return nums[rand() % (right - left + 1) + left];}};

3. 數組中的第K個最大元素

題目鏈接 -> Leetcode -215.數組中的第K個最大元素

Leetcode -215.數組中的第K個最大元素

題目:給定整數數組 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 <= 10^5
  • 10^4 <= nums[i] <= 10^4

思路是使用快排思想,將數組分為三塊,然后分三種情況討論,具體思路參考代碼解析;

代碼如下:

		class Solution {public:int findKthLargest(vector<int>& nums, int k){srand(time(nullptr));return FindMaxTopk(nums, 0, nums.size() - 1, k);}int FindMaxTopk(vector<int>& nums, int l, int r, int k){if (l == r) return nums[l];// 根據 key 將數組分為三塊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]);}// [l, left] [left + 1, right - 1] [right, r]int part2 = right - left - 1, part3 = r - right + 1;// 分情況討論// 情況1、區間3的個數大于等于k,那么目標值一定在區間3if (part3 >= k) return FindMaxTopk(nums, right, r, k);// 情況2、區間2+區間3的個數大于等于k,目標值一定在區間2,即一定是 keyelse if (part2 + part3 >= k) return key;// 情況3、如果不滿足上面情況,則目標值一定在區間1else return FindMaxTopk(nums, l, left, k - part2 - part3);}// 獲取數組內的一個隨機值int getRandom(vector<int>& nums, int left, int right){return nums[rand() % (right - left + 1) + left];}};

4. 庫存管理Ⅲ

題目鏈接 -> Leetcode -LCR 159.庫存管理Ⅲ

Leetcode -LCR 159.庫存管理Ⅲ

題目:倉庫管理員以數組 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

思路:與上題思路類似;在快排中,當我們把數組「分成三塊」之后: [l, left] [left + 1, right - 1] [right, r] ,我們可以通過計算每一個區間內元素的「個數」,進而推斷出最小的 k 個數在哪些區間里面。那么我們可以直接去「相應的區間」繼續劃分數組即可。

代碼如下:

		class Solution {public:void my_qsort(vector<int>& arr, int l, int r, int k){if(l >= r) return;// 根據 key 值分區間int key = getRandom(arr, l, r);int i = l, left = l - 1, right = r + 1;while(i < right){if(arr[i] < key) swap(arr[++left], arr[i++]);else if(arr[i] == key) i++;else swap(arr[--right], arr[i]);}// 根據元素個數分情況討論// [l, left] [left + 1][right - 1] [right, r]int part1 = left - l + 1, part2 = right - left - 1;if(part1 >= k) my_qsort(arr, l, left, k);else if(part1 + part2 >= k) return;else my_qsort(arr, right, r, k - part1 - part2);}// 選取基準值int getRandom(vector<int>& arr, int left, int right){return arr[rand() % (right - left + 1) + left];}vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(nullptr));// 快速選擇算法,將數組分為三個區間,選擇基準值key,比key小的元素全扔到左邊my_qsort(stock, 0, stock.size() - 1, cnt);return vector<int>(stock.begin(), stock.begin() + cnt);}};

5. 排序數組(歸并排序)

題目鏈接 -> Leetcode -912.排序數組(歸并排序)

Leetcode -912.排序數組(歸并排序)

題目:給你一個整數數組 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 * 10^4
  • 5 * 10^4 <= nums[i] <= 5 * 10^4

思路:歸并排序的流程充分的體現了「分而治之」的思想,大體過程分為兩步:

  • 分:將數組一分為二為兩部分,一直分解到數組的長度為 1 ,使整個數組的排序過程被分為「左半部分排序」 + 「右半部分排序」;
  • 治:將兩個較短的「有序數組合并成?個長的有序數組」,一直合并到最初的長度

代碼如下:

		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 = left + (right - left) / 2;// [left, mid] [mid + 1, right]mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);// 合并兩個區間// vector<int> tmp(right - left + 1);  // 可以在全局定義,提高效率int i = 0, cur1 = left, cur2 = mid + 1;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];}};

6. 交易逆序對的總數

題目鏈接 -> Leetcode -LCR 170.交易逆序對的總數

Leetcode -LCR 170.交易逆序對的總數

題目:在股票交易中,如果前一天的股價高于后一天的股價,則可以認為存在一個「交易逆序對」。請設計一個程序,輸入一段時間內的股票交易記錄 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

思路:用歸并排序求逆序數,主要就是在歸并排序的合并過程中統計出逆序對的數量,也就是在合并兩個有序序列的過程中,能夠快速求出逆序對的數量。

1. 為什么可以利用歸并排序?

如果我們將數組從中間劃分成兩個部分,那么我們可以將逆序對產生的方式劃分成三組:

  • 逆序對中兩個元素:全部從左數組中選擇
  • 逆序對中兩個元素:全部從右數組中選擇
  • 逆序對中兩個元素:一個選左數組另一個選右數組

根據排列組合的分類相加原理,三種情況下產生的逆序對的總和,正好等于總的逆序對數量。

而這個思路正好匹配歸并排序的過程:

  • 先排序左數組;
  • 再排序右數組;
  • 左數組和右數組合?為一;

因此,我們可以利用歸并排序的過程,先求出左半數組中逆序對的數量,再求出右半數組中逆序對的數量,最后求出一個選擇左邊,另一個選擇右邊情況下逆序對的數量,三者相加即可。

2. 為什么要這么做?

在歸并排序合并的過程中,我們得到的是兩個有序的數組。我們是可以利用數組的有序性,快速統計出逆序對的數量,而不是將所有情況都枚舉出來。

最核心的問題,如何在合并兩個有序數組的過程中,統計出逆序對的數量?合并兩個有序序列時求逆序對的方法有兩種:

  1. 快速統計出某個數前面有多少個數比它大;
  2. 快速統計出某個數后面有多少個數比它小;

代碼如下:

		class Solution{vector<int> tmp;public:int reversePairs(vector<int>& nums){tmp.resize(nums.size());return mergeSort(nums, 0, nums.size() - 1);}int mergeSort(vector<int>& nums, int left, int right){if (left >= right) return 0;// [left, mid] [mid + 1, right]int mid = left + (right - left) / 2;// 先統計兩個區間各自的逆序對個數 + 排序int ret = 0;ret += mergeSort(nums, left, mid);ret += mergeSort(nums, mid + 1, right);// 兩個區間每個區間選一個進行比較,因為比較時區間已經排序好,所以當cur1中出現第一次比cur2大的數時,cur1 后面的數都可以全部統計int cur1 = left, cur2 = mid + 1, i = 0;while (cur1 <= mid && cur2 <= right){if (nums[cur1] > nums[cur2]) ret += mid - cur1 + 1;tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];}// 處理細節,還沒結束的指針后的數全放入tmp中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;}};

7. 計算右側小于當前元素的個數

題目鏈接 -> Leetcode -315.計算右側小于當前元素的個數

Leetcode -315.計算右側小于當前元素的個數

題目:給你一個整數數組 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 <= 10^5
  • 10^4 <= nums[i] <= 10^4

思路:這一道題的解法與上一題的解法是類似的,但是這一道題要求的不是求總的個數,而是要返回一個數組,記錄每一個元素的右邊有多少個元素比自己小。

但是在我們歸并排序的過程中,元素的下標是會跟著變化的,因此我們需要一個輔助數組,來將數組元素和對應的下標綁定在一起歸并,也就是再歸并元素的時候,順勢將下標也轉移到對應的位置上。

代碼如下:

		class Solution {// 將原數組的元素和下標綁定在一起,元素順序改變時,對應的下標也跟著改變vector<int> tmpElement, tmpIndex;vector<int> index;vector<int> ret;public:vector<int> countSmaller(vector<int>& nums) {ret.resize(nums.size());index.resize(nums.size());// 初始化下標for(int i = 0; i < nums.size(); i++)index[i] = i;tmpElement.resize(nums.size());tmpIndex.resize(nums.size());mergeSort(nums, 0, nums.size() - 1);return ret;}void mergeSort(vector<int>& nums, int left, int right){if(left >= right) return;int mid = left + (right - left) / 2;// [left, mid] [mid + 1, right]mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){// index[cur1] 存的是 nums[cur1] 這個元素的原始下標if(nums[cur1] > nums[cur2]) ret[index[cur1]] += right - cur2 + 1;// 同步更新下標和元素tmpIndex[i] = nums[cur1] > nums[cur2]? index[cur1] : index[cur2];tmpElement[i++] = nums[cur1] > nums[cur2]? nums[cur1++] : nums[cur2++];}while(cur1 <= mid){tmpIndex[i] = index[cur1];tmpElement[i++] = nums[cur1++];}while(cur2 <= right){tmpIndex[i] = index[cur2];tmpElement[i++] = nums[cur2++];}// 同步拷貝下標和元素for(int j = left; j <= right; j++){index[j] = tmpIndex[j - left];nums[j] = tmpElement[j - left];}}};

8. 翻轉對

題目鏈接 -> Leetcode -493.翻轉對

Leetcode -493.翻轉對

題目:給定一個數組 nums ,如果 i < j 且 nums[i] > 2 * nums[j] 我們就將(i, j) 稱作一個重要翻轉對。
你需要返回給定數組中的重要翻轉對的數量。

示例 1:
輸入: [1, 3, 2, 3, 1]
輸出 : 2

示例 2 :
輸入 : [2, 4, 3, 5, 1]
輸出 : 3

注意 :
給定數組的長度不會超過50000。
輸入數組中的所有數字都在32位整數的表示范圍內。

思路:翻轉對和逆序對的定義大同小異,逆序對是前面的數要大于后面的數。而翻轉對是前面的?個數要大于后面某個數的兩倍。因此,我們依舊可以用歸并排序的思想來解決這個問題。

大思路與求逆序對的思路一樣,就是利用歸并排序的思想,將求整個數組的翻轉對的數量,轉換成三部分:左半區間翻轉對的數量,右半區間翻轉對的數量,一左一右選擇時翻轉對的數量。重點就是在合并區間過程中,如何計算出翻轉對的數量。

例如 left = [4, 5, 6] right = [3, 4, 5] 時,如果是歸并排序的話,我們需要計算 left 數組中有多少個能與 3 組成翻轉對。但是我們要遍歷到最后?個元素 6 才能確定,時間復雜度較高。因此我們需要在歸并排序之前完成翻轉對的統計。

下面以?個示例來模仿兩個有序序列如何快速求出翻轉對的過程:假定已經有兩個已經有序的序列 left = [4, 5, 6] right = [1, 2, 3] ;用兩個指針 cur1 和 cur2 遍歷兩個數組

  • 對于任意給定的 left[cur1] 而言,我們不斷地向右移動 cur2,直到 left[cur1] <= 2 * right[cur2]。此時對于 right 數組而言,cur2 之前的元素全部都可以與 left[cur1] 構成翻轉對。
  • 隨后,我們再將 cur1 向右移動?個單位,此時 cur2 指針并不需要回退(因為 left 數組是升序的)依舊往右移動直到 left[cur1] <= 2 * right[cur2]。不斷重復這樣的過程,就能夠求出所有左右端點分別位于兩個子數組的翻轉對數目。

由于兩個指針最后都是不回退的的掃描到數組的結尾,因此兩個有序序列求出翻轉對的時間復雜度是 O(N).

綜上所述,我們可以利用歸并排序的過程,將求一個數組的翻轉對轉換成求左數組的翻轉對數量 + 右數組中翻轉對的數量 + 左右數組合并時翻轉對的數量。

代碼如下:

		class Solution {vector<int> tmp;public:int reversePairs(vector<int>& nums) {      tmp.resize(nums.size());return mergeSort(nums, 0, nums.size() - 1);}int mergeSort(vector<int>& nums, int left, int right){if(left >= right) return 0;// 1.根據中間元素劃分區間int mid = left + (right - left) / 2;// 2. 先計算左右區間的翻轉對// [left, mid] [mid + 1, right]int ret = 0;ret += mergeSort(nums, left, mid);ret += mergeSort(nums, mid + 1, right);// 3.先利用左右區間有序的性質計算翻轉對的數量int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid){while(cur2 <= right && nums[cur2] >= nums[cur1] / 2.0) cur2++;ret += right - cur2 + 1;cur1++;}// 4.合并歸并區間cur1 = left, cur2 = mid + 1;while(cur1 <= mid && cur2 <= right)tmp[i++] = nums[cur2] > nums[cur1]? 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 - left];return ret;}};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214463.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【華為數據之道學習筆記】3-5 規則數據治理

在業務規則管理方面&#xff0c;華為經常面對“各種業務場景業務規則不同&#xff0c;記不住&#xff0c;找不到”“大量規則在政策、流程等文件中承載&#xff0c;難以遵守”“各國規則均不同&#xff0c;IT能否一國一策、快速上線”等問題。 規則數據是結構化描述業務規則變量…

【Qt開發流程】之UI風格、預覽及QPalette使用

概述 一個優秀的應用程序不僅要有實用的功能&#xff0c;還要有一個漂亮美膩的外觀&#xff0c;這樣才能使應用程序更加友善、操作性良好&#xff0c;更加符合人體工程學。作為一個跨平臺的UI開發框架&#xff0c;Qt提供了強大而且靈活的界面外觀設計機制&#xff0c;能夠幫助…

利用Rclone將阿里云對象存儲遷移至雨云對象存儲的教程,對象存儲數據遷移教程

使用Rclone將阿里云對象存儲(OSS)的文件全部遷移至雨云對象存儲(ROS)的教程&#xff0c;其他的對象存儲也可以參照本教程。 Rclone簡介 Rclone 是一個用于和同步云平臺同步文件和目錄命令行工具。采用 Go 語言開發。 它允許在文件系統和云存儲服務之間或在多個云存儲服務之間…

STM32-EXTI外部中斷

目錄 一、中斷系統 二、STM32中斷 三、NVIC&#xff08;嵌套中斷向量控制器&#xff09;基本結構 四、NVIC優先級分組 五、EXTI外部中斷 5.1 外部中斷基本知識 5.2 外部中斷&#xff08;EXTI&#xff09;基本結構 ?編輯 5.2.1開發步驟&#xff1a; 5.3 AFIO復用IO口…

ADAudit Plus:強大的網絡安全衛士

隨著數字化時代的不斷發展&#xff0c;企業面臨著越來越復雜和多樣化的網絡安全威脅。在這個信息爆炸的時代&#xff0c;保護組織的敏感信息和確保網絡安全已經成為企業發展不可或缺的一環。為了更好地管理和監控網絡安全&#xff0c;ADAudit Plus應運而生&#xff0c;成為網絡…

ThreadLocal系列-ThreadLocalMap源碼

1.ThreadLocalMap.Entry key&#xff1a;指向key的是弱引用 value&#xff1a;強引用 public class ThreadLocal<T> {static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always…

32、卷積參數 - 長寬方向的公式推導

有了前面三節的卷積基礎 padding, stride, dilation 之后,大概就可以了解一個卷積算法的全貌了。 一個完整的卷積包含的輸入和輸出有: 輸入圖像,表示為[n, hi, wi, ci] 卷積核,表示為[co, kh, kw, ci] 輸出特征圖,表示為[n, ho, wo, co] 以上為卷積算法的兩個輸入 tensor…

【持更】python數據處理-學習筆記

1、讀取excel /csv及指定sheet&#xff1a; pd.read_excel("路徑",sheetname"xx") 修改列名df.rename 修改字符串類型到數字 pandas.to_numeric&#xff08;&#xff09; 2、刪除drop、去重drop_duplicates &#xff08;1&#xff09;空值所在行/列 行&am…

Redis分布式鎖有什么缺陷?

Redis分布式鎖有什么缺陷&#xff1f; Redis 分布式鎖不能解決超時的問題&#xff0c;分布式鎖有一個超時時間&#xff0c;程序的執行如果超出了鎖的超時時間就會出現問題。 1.Redis容易產生的幾個問題&#xff1a; 2.鎖未被釋放 3.B鎖被A鎖釋放了 4.數據庫事務超時 5.鎖過期了…

centos 7 卸載圖形化界面步驟記錄

centos7 服務器操作系統&#xff0c;挺小一配置&#xff0c;裝了圖形化界面&#xff0c;現在運行程序的時候跑不動了&#xff0c;我想這圖形界面也沒啥用&#xff0c;卸載了算了&#xff01; 卸載步驟 yum grouplist 查詢已經安裝的組件 可以看到 圖形化界面 等是以分組存在的…

深入理解Spring IOC的工作流程

理解Spring IOC&#xff08;Inversion of Control&#xff09;的工作流程是理解Spring框架的核心之一。下面是Spring IOC的基本工作流程&#xff1a; 配置&#xff1a; 開發者通過XML配置文件、Java配置類或者注解等方式&#xff0c;定義應用中的Bean以及它們之間的依賴關系。這…

TCP數據粘包的處理

TCP數據粘包的處理 背鍋俠TCP解決方案2.1 發送端2.2 接收端 背鍋俠TCP 在前面介紹套接字通信的時候說到了TCP是傳輸層協議&#xff0c;它是一個面向連接的、安全的、流式傳輸協議。因為數據的傳輸是基于流的所以發送端和接收端每次處理的數據的量&#xff0c;處理數據的頻率可…

Qt練習題

1.使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是否…

代碼隨想錄 96. 不同的二叉搜索樹

題目 給你一個整數 n &#xff0c;求恰由 n 個節點組成且節點值從 1 到 n 互不相同的 二叉搜索樹 有多少種&#xff1f;返回滿足題意的二叉搜索樹的種數。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;5 示例 2&#xff1a; 輸入&#xff1a;n 1 輸出&#xff1…

【Angular開發】Angular 16發布:發現前7大功能

Angular 于2023年5月3日發布了主要版本升級版Angular 16。作為一名Angular開發人員&#xff0c;我發現這次升級很有趣&#xff0c;因為與以前的版本相比有一些顯著的改進。 因此&#xff0c;在本文中&#xff0c;我將討論Angular 16的前7個特性&#xff0c;以便您更好地理解。…

機器學習基礎介紹

百度百科&#xff1a; 機器學習是一門多領域交叉學科&#xff0c;涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為&#xff0c;以獲取新的知識或技能&#xff0c;重新組織已有的知識結構使之不斷改善自身的性能。 …

手工酸奶店如何選址?開在哪里比較合適?

手工酸奶店是一個非常受歡迎的創業項目&#xff0c;但想要成功開店&#xff0c;選址是非常重要的。 本人開酸奶店5年時間&#xff0c;下面我將為大家分享一些選址的小技巧&#xff0c;希望對大家有所幫助。&#xff08;可以點贊收藏&#xff0c;方便以后隨時查閱&#xff09; …

入職字節外包一個月,我離職了。。。

有一種打工人的羨慕&#xff0c;叫做“大廠”。 真是年少不知大廠香&#xff0c;錯把青春插稻秧。 但是&#xff0c;在深圳有一群比大廠員工更龐大的群體&#xff0c;他們頂著大廠的“名”&#xff0c;做著大廠的工作&#xff0c;還可以享受大廠的伙食&#xff0c;卻沒有大廠…

12.11 C++ 作業

完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示”登錄成功“&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面 如果賬號和密碼不匹配&#xf…

樹根研習社|數據為王,洞察“工業數據采集”背后的價值與實踐

一、工業數據采集是什么&#xff1f; 數據采集是將各種信息傳感設備通過網絡結合起來&#xff0c;實現任何時間、任何地點&#xff0c;人、機、物的互聯互通。數據采集的主要的作用是&#xff1a; “翻譯官”&#xff1a;不同程序語言的設備數據通過協議解析“翻譯”為上層系…