LeetCode經典題之876、143 題解及延伸

系列目錄

88.合并兩個有序數組
52.螺旋數組
567.字符串的排列
643.子數組最大平均數
150.逆波蘭表達式
61.旋轉鏈表
160.相交鏈表
83.刪除排序鏈表中的重復元素
389.找不同
1491.去掉最低工資和最高工資后的工資平均值
896.單調序列
206.反轉鏈表
92.反轉鏈表II
141.環形鏈表
142.環型鏈表


目錄

  • 系列目錄
  • 876. 鏈表的中間節點
    • 線性表
  • 143. 重排鏈表
    • push_back()與emplace_back()
      • push_back()
      • emplace_back()


876. 鏈表的中間節點

🌟線性表/動態數組+快慢指針

原題鏈接


C++
若未特殊標明,以下題解均寫用C++

方法一 快慢指針
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode *slow = head, *fast = head;// 記得一定要先對fast 進行檢查while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;}return slow;}
};

先檢查 fast 是為了確保在嘗試訪問 fast->next 之前,fast 不是 nullptr,從而可以避免未定義行為


方法二 線性表/動態數組
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* middleNode(ListNode* head) {// 定義一個類似于數組特性的線性表——支持下標訪問vector<ListNode*> a = {head};// a.back()取原線性表的最后一個元素while (a.back()->next != nullptr)a.push_back(a.back()->next);// C++ 默認向下取整return a[a.size() / 2];}
};

注解:

vector<ListNode*> a = {head};

vector的元素為鏈表的節點ListNode*——這也是我們為什么要nullptr的原因

并創建一個包含單個元素( 即head指針)的vector

若沒有{head},則定義的是一個空的容器vector

線性表

定義

  • 線性表( Linear List)是數據結構的一種,它是一個具有相同特性的數據元素的有限序列
  • 數據元素之間的關系是一對一的,即除了第一個和最后一個數據元素之外,其他數據元素都是首尾相接的
  • 線性表的個數n定義為線性表的長度,n=0時稱為空表

性質

  1. 集合中必存在唯一的一個“第一元素”:線性表有明確的起始點
  2. 集合中必存在唯一的一個“最后元素”:線性表有明確的終止點
  3. 除最后一個元素之外,均有唯一的后繼( 后件):除了最后一個元素,每個元素后面都跟著一個元素
  4. 除第一個元素之外,均有唯一的前驅( 前件):除了第一個元素,每個元素前面都有一個元素
  5. 線性表能夠逐項訪問和順序存取:可以按照元素的順序進行訪問和存儲

分類

  • 一般線性表:可以自由地進行刪除或添加操作
  • 受限線性表:主要包括棧( 后進先出)和隊列( 先進先出),對結點的操作有限制

基本操作

  1. MakeEmpty(L):將L變為空表
  2. Length(L):返回表L的長度,即表中元素個數
  3. Get(L, i):返回L中位置i處的元素( 1≤i≤n)
  4. Prior(L, i):取i的前驅元素
  5. Next(L, i):取i的后繼元素
  6. Locate(L, x):返回元素x在L中的位置
  7. Insert(L, i, x):在表L的位置i處插入元素x,將原占據位置i的元素及后面的元素都向后推一個位置
  8. Delete(L, p):從表L中刪除位置p處的元素
  9. IsEmpty(L):判斷L是否為空表

應用場景

  • 通訊錄管理:每個聯系人作為線性表的一個元素,包含姓名、電話號碼、地址等屬性
  • 緩存替換算法:如最近最少使用算法(LRU)和先進先出算法(FIFO),使用線性表結構便于對緩存中的數據進行插入、刪除和查找操作
  • 任務調度系統:將需要執行的任務按照一定的優先級順序存儲在線性表中
  • 計算機圖形學:頂點表用于存儲圖形模型的頂點信息,每個元素表示一個頂點
  • 公交線路查詢系統:線路信息可以用線性表來存儲,每個線路作為線性表的一個元素

優點

  • 邏輯結構簡單,便于實現和操作
  • 廣泛應用于各種實際場景中,是數據處理和存儲的基礎結構之一





143. 重排鏈表

🌟線性表/動態數組

原題鏈接


C++
若未特殊標明,以下題解均寫用C++

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* head) {// 特況if (head == nullptr) return;// 定義一個空線性表 Linear Listvector<ListNode*> LL;ListNode* node = head;// 將 鏈表節點 存入 線性表中while (node != nullptr) {LL.emplace_back(node);node = node->next;}// 下標從0開始int i = 0, j = LL.size() - 1;while (i < j) {// 像數組一樣 可用下標訪問LL[i]->next = LL[j];i ++;// 如LL.size() = 2,提前結束循環if (i == j)break;LL[j]->next = LL[i];// 用完 j 再更新j --;}// 最后別忘了 指向空LL[i]->next = nullptr;}
};

push_back()與emplace_back()

push_back()

push_backstd::vector 的一個成員函數,用于在容器的末尾添加一個元素 當你使用 push_back 時,你需要提供一個與容器內元素類型相同的對象( 或者一個可以隱式轉換為該類型的對象) 這個對象會被復制( 如果類型支持復制)或移動( 如果類型支持移動并且提供了右值引用)到容器的末尾

示例:

#include <vector>  
#include <string>  int main() {  std::vector<std::string> vec;  // 使用 push_back 添加一個字符串  std::string str = "Hello";  vec.push_back(str); // 這里可能發生復制或移動操作  // 也可以直接使用臨時對象  vec.push_back(std::string("World")); // 這里一定會發生復制操作( 因為我們是用一個右值來初始化一個臨時對象)  return 0;  
}

在上面的例子中,當你使用 push_back 并傳遞一個 std::string 對象時,如果 str 是一個左值( 即具有持久身份的對象),那么它可能會被復制或移動( 取決于 std::string 的實現和編譯器優化) 如果你傳遞一個右值( 如臨時對象),那么通常會發生復制操作,因為右值通常不被視為可移動的對象( 盡管在某些情況下,編譯器可能會進行優化以消除不必要的復制)


emplace_back()

emplace_back 是 C++11 引入的一個成員函數,旨在提供比 push_back 更高的性能 與 push_back 不同,emplace_back 允許你直接在容器的末尾構造一個元素,而不是先創建一個對象然后將其復制或移動到容器中 這通常可以避免不必要的復制或移動操作,尤其是在處理大型或復雜的對象時

emplace_back 接受與要構造的對象構造函數相同的參數,并在容器的末尾直接調用該構造函數

示例:

#include <vector>  
#include <string>  int main() {  std::vector<std::string> vec;  // 使用 emplace_back 直接在容器末尾構造一個字符串  vec.emplace_back("Hello"); // 直接在vec的末尾構造一個std::string對象,沒有復制或移動  // 也可以傳遞多個參數給構造函數  vec.emplace_back(5, 'a'); // 構造一個包含5個'a'字符的std::string對象  return 0;  
}

在上面的例子中,emplace_back 直接在 vec 的末尾構造了一個 std::string 對象,沒有涉及任何復制或移動操作
這通常比使用 push_back 并傳遞一個臨時對象更高效

總結:

push_backemplace_back 都用于在 std::vector 的末尾添加元素,但 emplace_back 通過直接在容器中構造元素來避免不必要的復制或移動操作,從而可能提供更高的性能

雖然 emplace_back 通常比 push_back 更高效,但在某些情況下(特別是當元素類型支持移動語義且移動操作比復制操作更快時),push_back 可能會使用移動操作來優化性能
然而,emplace_back 仍然是一個很好的選擇,特別是當對象的構造過程涉及多個參數或復雜邏輯時

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

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

相關文章

paddleocr查看標注好的數據錯誤信息

字符計數 import os import json from collections import Counter# 按字符計數 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面試題:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 將數據的存儲和索引放在一塊,索引結構的葉子節點保存了行數據 索引字段必須存在,且只能存在一個 非聚集索引(二級索引) 將數據和索引分開存儲,索引結構的葉子節點關聯的是對應的主鍵 索引字段可以存在多個 索引的選取規則 如果…

【學習】常用的分類網絡

1. LeNet 提出時間&#xff1a;1998年最新版本&#xff1a;原始版本使用的數據集格式&#xff1a;MNIST&#xff08;28x28灰度圖像&#xff09;優點&#xff1a; 結構簡單&#xff0c;易于理解和實現。對于小規模圖像數據集&#xff08;如MNIST&#xff09;有很好的表現。缺點…

豆瓣高分項目管理書籍推薦

&#x1f4ec;豆瓣網站上有很多項目管理領域的書籍獲得了較高的評分&#xff0c;以下是一些高分項目管理書籍的精選列表&#xff0c;發出來跟大家分享一下&#xff1a; 《項目管理知識體系指南&#xff08;PMBOK指南&#xff09;》 【內容簡介】這本書是美國項目管理協會&…

opencv檢測圖片上七種顏色,分辨顏色和對應位置

opencv檢測圖片上七種顏色&#xff0c;分辨顏色和對應位置 讀取圖片&#xff1a;使用cv2.imread()函數讀取目標圖片。 轉換顏色空間&#xff1a;通常在HSV顏色空間中進行顏色檢測&#xff0c;因為HSV顏色空間更適合描述顏色的屬性。 定義顏色范圍&#xff1a;為七種顏色定義…

RabbitMQ 修改默認密碼

RabbitMQ的一些常用命令 #啟動rabbitmq service rabbitmq-server start# 查看rabbitMQ的運行狀態 service rabbitmq-server status# 開啟rabbitMQ的后臺管理插件 rabbitmq-plugins enable rabbitmq_management # 重啟RabbitMQ服務 service rabbitmq-server restart RabbitMQ的…

AcWing 797:差分 ← 一維差分模板題

【題目來源】https://www.acwing.com/problem/content/799/【題目描述】 輸入一個長度為 n 的整數序列。 接下來輸入 m 個操作&#xff0c;每個操作包含三個整數 l,r,c&#xff0c;表示將序列中 [l,r] 之間的每個數加上 c。 請你輸出進行完所有操作后的序列。【輸入格式】 第一…

富格林:正規操作實現穩健出金

富格林認為&#xff0c;當下的金融市場&#xff0c;投資者進行理財都會特別關注盈利效率高的產品&#xff0c;而近年來興起的現貨黃金&#xff0c;其高效的盈利效率吸引著大批朋友關注。不過&#xff0c;要想在這盈利出金&#xff0c;就得學習掌握正規的交易策略。下面富格林將…

onnx模型修改:去掉Dropout層

文章目錄 嘗試1&#xff1a;強行設置dropout層train mode為False嘗試2&#xff1a;找到onnx模型中的dropout, train mode設置為False嘗試3&#xff1a;直接刪除dropout層&#xff0c;連接其輸入輸出結語 最近訓練模型使用了tinyvit&#xff0c;性能挺強的&#xff1a; 但是導出…

超細毛搭配超寬設計,一款更呵護牙齦的牙刷

牙齦敏感的時候&#xff0c;刷牙特別難受&#xff0c;最近試了試惠百施&#xff08;EBISU&#xff09;65孔寬頭軟毛牙刷&#xff0c;感覺它的口腔護理體驗很不錯。這款牙刷的設計獨特&#xff0c;采用寬頭設計&#xff0c;一次就能刷兩排牙齒&#xff0c;極大地提高了清潔效率。…

RS232自由轉Profinet協議網關模塊連接1200PLC與掃碼槍通訊及手動清零案例

一、RS232和Profinet這兩種通訊接口的特點和應用場景&#xff1a; RS232是一種串行通訊接口標準&#xff0c;常用于連接計算機和外部設備&#xff0c;傳輸速率較低但穩定可靠。Profinet則是一種工業以太網通訊協議&#xff0c;具有高速、實時性強的特點&#xff0c;適用于工業…

C/C++語言通過動態鏈表實現按需內存分配和使用(Linux Ubuntu 24.04環境)

我認為比較理想的內存使用方式應該實現這幾個特性&#xff1a; 1. 分配一塊能滿足大多數情況下需求的內存&#xff0c;比如80%的情況下都不需要再次分配內存。 2. 對另外20%需要較多內存的情況&#xff0c;可以通過動態鏈表按需追加新的內存塊。 3. 要對總共消耗的內存有一個…

【C語言】解決C語言報錯:Dangling Pointer

文章目錄 簡介什么是Dangling PointerDangling Pointer的常見原因如何檢測和調試Dangling Pointer解決Dangling Pointer的最佳實踐詳細實例解析示例1&#xff1a;釋放內存后未將指針置為NULL示例2&#xff1a;返回指向局部變量的指針示例3&#xff1a;指針懸空后繼續使用示例4&…

引領未來:AI Native與物聯網(IoT)的革命性融合

引領未來&#xff1a;AI Native與物聯網(IoT)的革命性融合 在數字化轉型的浪潮中&#xff0c;AI Native作為一種新興的軟件開發模式&#xff0c;正逐漸成為推動技術創新的核心力量。與此同時&#xff0c;物聯網(IoT)技術通過連接物理世界與數字世界&#xff0c;不斷擴展其應用…

自編碼器筆記

編碼器解碼器自編碼器 先壓縮特征&#xff0c;再通過特征還原。 判斷還原的和原來的是否相等 encode data 在一個“潛在空間”里。它的用途是“深度學習”的核心-學習數據的特征并簡化數據表示形式以尋找模式。 變分自編碼器&#xff1a; 1. 首先、假設輸入數據是符合正態分布…

tiny-redis 項目可能的問題

https://build-your-own.org/redis/ 事件循環怎么實現的 首先我將連接包裝為一個 Connect 類&#xff0c;它包含了 socket fd&#xff0c;讀寫緩沖區&#xff0c;連接狀態&#xff08;這個連接是發送數據還是接收數據&#xff09;等成員屬性 我會在全局維護一個從 socket fd…

003 選擇排序

文章目錄 先挑最值&#xff0c;再把剩下的挑最值&#xff0c;再把剩下的挑最值。。。 -- 排序函數 function selectionSort(arr) -- 外層循環&#xff0c;從數組的第一個元素開始&#xff0c;對每個元素進行排序 for i 1, #arr do -- 假設當前位置的元素是最小的 local …

LCR 060. 前 K 個高頻元素

給定一個整數數組 nums 和一個整數 k &#xff0c;請返回其中出現頻率前 k 高的元素。可以按 任意順序 返回答案。 示例 1: 輸入: nums [1,1,1,2,2,3], k 2 輸出: [1,2] 示例 2: 輸入: nums [1], k 1 輸出: [1] 提示&#xff1a; 1 < nums.length < 105k 的取值范…

【SQL Server點滴積累】Setup SQL Server 2008 Database Mirror (二)

【SQL Server點滴積累】Setup SQL Server 2008 Database Mirror (一)-CSDN博客今天分享SQL Server 2008 R2搭建數據庫鏡像(Database Mirror)https://blog.csdn.net/ncutyb123/article/details/139749117?spm1001.2014.3001.5501本篇Blog基于以上Blog步驟進行SQL Server 2008 R…

python03——文件操作(new)

“變量”open&#xff08;‘文件路徑’&#xff0c;‘模式’&#xff09; //注意加引號 “變量”.write( ) //write函數是寫的是字符串&#xff0c;如果你寫的東西不是字符串&#xff0c;要寫成write&#xff08;str&#xff08;。。&#xff09;&#xff09; “變量”.read…