力扣熱題100——雙指針

雙指針

  • 兩數之和(有序數組,相向雙指針)
  • 問題:在有序數組中找到兩個數,使它們的和等于目標值。
  • 思路:左指針從起點出發,右指針從終點出發,根據和與目標值的大小調整指針。
#include <vector>
using namespace std;vector<int> twoSum(vector<int>& numbers, int target) {int left = 0;                  // 左指針(起點)int right = numbers.size() - 1; // 右指針(終點)while (left < right) {int sum = numbers[left] + numbers[right];if (sum == target) {// 找到目標,返回索引(題目可能要求+1,根據具體要求調整)return {left + 1, right + 1};} else if (sum < target) {// 和太小,左指針右移(增大總和)left++;} else {// 和太大,右指針左移(減小總和)right--;}}return {}; // 無結果(題目通常保證有解)
}

移動零

  • 思路:左指針從起點出發,右指針也從起點出發,但是快慢不同。

在這里插入圖片描述

class Solution {        // 定義Solution類,用于封裝解題方法
public:                 // 公共成員函數,外部可直接調用// 函數定義:接收整數數組nums的引用(原地修改),無返回值void moveZeroes(vector<int>& nums) {int l = 0;      // 定義慢指針l,初始化為0// 作用:記錄下一個非零元素應該存放的位置int n = nums.size();  // 計算數組長度n,避免多次調用size()函數// 定義快指針r,從0開始遍歷整個數組for(int r = 0; r < n; r++){// 當快指針指向的元素不是0時if(nums[r] != 0){// 將非零元素放到慢指針l的位置nums[l] = nums[r];// 慢指針后移一位,準備接收下一個非零元素l++;}}// 遍歷結束后,慢指針l之前的位置已放滿所有非零元素// 從l開始到數組末尾,填充0for(int i = l; i < n; i++){nums[i] = 0;}}
};

盛最多水的容器

在這里插入圖片描述

class Solution {        // 定義Solution類,用于封裝解題方法
public:                 // 公共成員函數,外部可直接調用// 函數定義:接收整數數組height的引用,返回最大容器容量(整數)int maxArea(vector<int>& height) {// 初始化雙指針:left指向數組起點,right指向數組終點int left = 0, right = height.size() - 1;// 初始化最大容量為0,用于記錄遍歷過程中找到的最大容量int maxWater = 0;// 雙指針循環條件:當左指針在右指針左側時繼續遍歷while (left < right) {// 計算當前容器的高度:取左右指針所指高度的較小值(容器高度由矮邊決定)int h = min(height[left], height[right]);// 計算當前容器的寬度:左右指針之間的距離(下標差)int w = right - left;// 更新最大容量:取當前容量(h*w)和歷史最大容量的較大值maxWater = max(maxWater, h * w);// 指針移動策略:移動較矮一側的指針(嘗試尋找更高的邊以增加容量)if (height[left] < height[right]) {left++;  // 左指針較矮,右移左指針} else {right--; // 右指針較矮(或等高),左移右指針}}// 循環結束后,返回最大容量return maxWater;}
};

三數之和

在這里插入圖片描述

#include <vector>          // 引入vector容器頭文件,用于存儲動態數組
#include <algorithm>       // 引入algorithm頭文件,用于調用sort排序函數
using namespace std;       // 使用std命名空間,簡化代碼書寫class Solution {           // 定義Solution類,封裝解題方法
public:                    // 公共成員函數,外部可直接調用// 函數定義:接收整數數組nums,返回所有和為0的三元組(不重復)vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;  // 定義結果容器,存儲符合條件的三元組sort(nums.begin(), nums.end());  // 對數組排序:1.便于雙指針查找 2.便于去重int n = nums.size();       // 計算數組長度n,避免重復調用size()// 外層循環:固定三元組中的第一個元素nums[i]for (int i = 0; i < n; ++i) {// 去重:若當前元素與前一個元素相同,跳過(避免重復三元組)if (i > 0 && nums[i] == nums[i - 1]) continue;// 定義雙指針:left指向i的下一個元素,right指向數組末尾int left = i + 1, right = n - 1;// 雙指針循環:尋找與nums[i]之和為0的兩個元素while (left < right) {// 計算當前三元組的和int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {  // 找到和為0的三元組// 將三元組加入結果容器res.push_back({nums[i], nums[left], nums[right]});// 去重:跳過left指針的重復元素while (left < right && nums[left] == nums[left + 1]) left++;// 去重:跳過right指針的重復元素while (left < right && nums[right] == nums[right - 1]) right--;// 雙指針同時移動,繼續尋找新的可能組合left++;right--;} else if (sum < 0) {  // 和小于0,需增大總和(左指針右移)left++;} else {  // 和大于0,需減小總和(右指針左移)right--;}}}return res;  // 返回所有符合條件的三元組}
};

接雨水

這個題目的關鍵是看每兩個柱子之間的高度差,而不是相乘求面積!因為其中的數值有變化嗎,如果按照求面積與盛水容器一樣的方法就會導致多求!算錯這是我的錯誤是思路!
但其相同點依舊是從左右指針開始判斷大小。

 		int left = 0;int right = height.size() - 1;// 當左指針在右指針左側時,繼續遍歷(兩指針相遇則遍歷結束)while (left < right) {......}

在這里插入圖片描述

class Solution {
public:int trap(vector<int>& height) {// 左指針,初始指向數組最左端int left = 0;// 右指針,初始指向數組最右端int right = height.size() - 1;// 記錄左側已遍歷區域的最高柱子高度int leftMax = 0;// 記錄右側已遍歷區域的最高柱子高度int rightMax = 0;// 最終接雨水的總量int res = 0;// 當左指針在右指針左側時,繼續遍歷(兩指針相遇則遍歷結束)while (left < right) {// 比較左右指針當前指向柱子的高度,優先處理較矮的一側if (height[left] < height[right]) {// 左側當前柱子高度 >= 左側已記錄的最高高度if (height[left] >= leftMax) {// 更新左側最高高度為當前柱子高度leftMax = height[left];} else {// 當前柱子可接雨水 = 左側最高高度 - 當前柱子高度res += leftMax - height[left];}// 左指針右移,處理下一個位置left++;} else {// 右側當前柱子高度 >= 右側已記錄的最高高度if (height[right] >= rightMax) {// 更新右側最高高度為當前柱子高度rightMax = height[right];} else {// 當前柱子可接雨水 = 右側最高高度 - 當前柱子高度res += rightMax - height[right];}// 右指針左移,處理下一個位置right--;}}// 返回最終接雨水的總量return res;}
};

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

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

相關文章

AI Infra與LLM的聯系與差異

一、定義與定位LLM&#xff08;大語言模型&#xff09; 定義&#xff1a;基于海量文本訓練的深度學習模型&#xff0c;通過Transformer架構實現語言理解與生成&#xff0c;典型代表如GPT-4、通義千問等。定位&#xff1a;AI應用的核心能力層&#xff0c;直接面向用戶提供文本生…

數據結構-雙鏈表

學習完單鏈表&#xff0c;現在繼續學習雙鏈表一、雙鏈表結構帶頭雙向循環鏈表&#xff08;簡稱&#xff1a;雙鏈表&#xff09;注意&#xff1a;這?的“帶頭”跟前面我們說的“頭節點”是兩個概念&#xff0c;實際前面的在單鏈表階段稱呼不嚴謹&#xff0c;但是為了同學們更好…

福彩雙色球第2025090期籃球號碼分析

明天是星期四&#xff0c;明天晚上雙色球開獎。福彩雙色球第2025090期籃球號碼分析&#xff0c;上期開出號碼05&#xff0c;數字形式是質數奇數2路球&#xff0c;小號0字頭數字。本期籃球號碼分析&#xff0c;籃球2尾數0212遺漏6期上次遺漏27期&#xff0c;籃球3尾數0313遺漏4期…

Python爬蟲實戰:研究Photon工具,構建企業信息收集系統

1. 引言 1.1 研究背景 在數字化時代,互聯網作為全球最大的信息載體,涵蓋商業情報、學術資源、公共信息等多個領域,對企業決策、學術研究和社會治理具有重要參考價值。傳統信息獲取方式依賴人工檢索和簡單腳本爬取,存在效率低下、覆蓋范圍有限、數據處理能力不足等問題。 …

Python Pandas.lreshape函數解析與實戰教程

Python Pandas.lreshape 函數解析與實戰教程 摘要 本教程旨在提供一份關于Pandas庫中 pandas.lreshape 函數的全面使用教程和分析。lreshape 是一個用于數據重塑(Data Reshaping)的工具,具體而言,它擅長將“寬格式”(Wide Format)數據轉換為“長格式”(Long Format)數…

vue3 el-dialog自定義實現拖拽、限制視口范圍增加了拖拽位置持久化的功能

采用element-plus的拖拽功能代碼,在此基礎上增加了記憶拖拽上次拖拽位置的功能,開袋即食; 前提:每次關閉彈窗都要銷毀; 解決了默認設置transform的偏移量后首次拖拽彈窗偏移量錯誤的問題修改。<template><el-dialogref="popupRefDialog":title="…

學習嵌入式之硬件——ARM體系

一、ARM內核基礎知識1.ALU&#xff1a;算術邏輯單元&#xff1b;完成運算的電路2.通用寄存器&#xff1a;R0~R15R13&#xff08;SP&#xff09;&#xff1a;棧指針寄存器&#xff1a;指向棧頂的位置&#xff1b;并在函數調用、中斷處理等場景中自動更新。R14&#xff08;LR&…

微信小程序中使用TensorFlowJS從環境搭建到模型訓練及推理模型得到預測結果

1、小程序端環境準備app.json"plugins": {"tfjsPlugin": {"version": "0.2.0","provider": "wx6afed118d9e81df9"}}package.json"dependencies": {"tensorflow-models/posenet": "^2.2.…

深入剖析通用目標跟蹤:一項綜述

摘要 通用目標跟蹤仍是計算機視覺領域一項重要且具有挑戰性的任務,其難點在于復雜的時空動態變化,尤其在存在遮擋、相似干擾物和外觀變化的情況下。過去二十年間,為應對這些挑戰,研究者提出了多種跟蹤范式,包括基于孿生網絡的跟蹤器、判別式跟蹤器以及近期突出的基于Tran…

Next.js 鏈接與導航:頁面間無縫切換

鏈接與導航&#xff1a;頁面間無縫切換 關鍵要點 Next.js 提供了 <Link> 組件和程序化導航方法&#xff0c;實現頁面間高效、無縫的切換。<Link> 組件利用客戶端導航和預加載技術&#xff0c;優化用戶體驗和性能。程序化導航通過 useRouter 鉤子&#xff08;Page…

根據經緯度(從nc格式環境數據文件中)提取環境因子

根據經緯度&#xff08;從nc格式環境數據文件中&#xff09;提取環境因子 文章目錄前言一、準備所需文件二、代碼分享總結前言 本文主要利用nc格式環境數據文件和物種經緯度分布文件&#xff0c;根據經緯度&#xff08;從nc格式環境數據文件中&#xff09;提取環境因子 一、準…

Uniapp 自定義 Tabbar 實現教程

Uniapp 自定義 Tabbar 實現教程1. 簡介2. 實現步驟2.1 創建自定義 Tabbar 組件2.2 配置 pages.json3.1 路由映射3.2 樣式設計3.3 圖標處理4. 常見問題及解決方案4.1 頁面跳轉問題4.2 樣式適配問題4.3 性能優化5. 擴展功能5.1 添加徽標5.2 添加動畫效果6. 總結1. 簡介 在 Uniap…

JuiceFS存儲

因語雀與csdn markdown 格式有區別&#xff0c;請查看原文&#xff1a; https://www.yuque.com/dycloud/pss8ys 一、JuiceFS 介紹 1.1 JuiceFS 是什么 JuiceFS 是一款面向云環境設計的高性能 POSIX 文件系統&#xff0c;核心能力是將對象存儲轉化為全功能文件系統。它采用獨…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十八) -> 構建HAR

目錄 1 -> 前言 2 -> 使用約束 3 -> 創建模塊 4 -> 構建HAR 4.1 -> 以debug模式構建HAR 4.2 -> 以release模式構建HAR 4.3 -> 構建字節碼格式的HAR 4.4 -> 對HAR進行簽名 1 -> 前言 構建模式&#xff1a;DevEco Studio默認提供debug和rele…

93、【OS】【Nuttx】【構建】cmake menuconfig 目標

【聲明】本博客所有內容均為個人業余時間創作&#xff0c;所述技術案例均來自公開開源項目&#xff08;如Github&#xff0c;Apache基金會&#xff09;&#xff0c;不涉及任何企業機密或未公開技術&#xff0c;如有侵權請聯系刪除 背景 接之前 blog 【OS】【Nuttx】【構建】cm…

React 表單處理:移動端輸入場景下的卡頓問題與防抖優化方案

文章目錄每日一句正能量前言一、問題場景與表現二、技術攻堅過程三、優化效果與經驗沉淀每日一句正能量 山再高&#xff0c;往上攀&#xff0c;總能登頂&#xff1b;路再長&#xff0c;走下去&#xff0c;終將到達。每日一勵&#xff0c;勇往直前。 前言 在移動端 React 項目開…

數據安全防護所需要的關鍵要素

數據安全防護是一個覆蓋數據全生命周期&#xff08;采集、存儲、傳輸、處理、銷毀&#xff09;、融合技術、管理、流程與人員的系統性工程。其核心目標是保障數據的??保密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integrity&#xff09;、可用性&#…

【JavaEE】(8) 網絡原理 HTTP/HTTPS

一、什么是 HTTP 協議 上節說到&#xff0c;應用層的協議需要約定通信的內容和數據格式。我們可以自定義應用層協議&#xff0c;也可以基于現成的應用層協議進行開發。協議的種類很多&#xff0c;最常見的之一就是 HTTP&#xff0c;廣泛用于網站和手機 App。準確來說&#xff0…

C語言的數組與字符串練習題4

C語言的數組與字符串練習題4 16. 數組元素去重 題目描述: 編寫一個C程序,輸入一組整數存儲在數組中,去除數組中的重復元素,并輸出去重后的數組。 解題思路: 遍歷數組,對于每個元素,檢查它之前是否已經存在相同的元素。如果不存在,則將其保留;否則,跳過。可以使用一…

Transformers簡單介紹 - 來源于huggingface

Transformers介紹 - 來源于huggingface 文章目錄Transformers介紹 - 來源于huggingfaceTransformers能做什么pipeline()函數零樣本分類推理API完形填空命名實體識別問答摘要提取翻譯transformers是如何工作的transformers的具體組成注意力層機制transformers原始結構architectu…