【專題刷題】雙指針(二)

📝前言說明:

  • 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

視頻

  • 202. 快樂數
    • 個人解
    • 優質解:
  • 11 盛最多水的容器
    • 個人解
    • 優質解:
  • 611. 有效三角形的個數
    • 個人解
    • 優質解:


202. 快樂數

在這里插入圖片描述

個人解

思路:沒思路,不知道如何判斷這個數不是快樂樹
用時:13:00
屎山代碼:無


優質解:

思路:不要偷懶,自己手算一遍這個過程才能發現規律
在這里插入圖片描述
你要問我為什么一定能成環
題目所給的數字范圍:1 <= n <= 2^31 - 12^31 - 1 == 2,147,483,647,總共有9位數,我們往大了取,假設每一位都為9,則999999999的平方和肯定是最大的,結果是9*9*10 == 810,那最小的數呢?顯然是1,也就是說每次變化的取值是在[1, 810]里面取。
但是,無限循環,取無數次,在[1, 810]里面取無數次,必然有重復!

對于能變成1的快樂數,因為1的平方還是1,所以,最后也是在一個全是1的環內循環

所以,這道題就變成:可以用快慢指針,慢指針每次移動一步,快指針每次移動兩步,因為有速度差且有環,所以快慢指針一定會在環內相遇。當快慢指針相遇時,判斷相遇的數是否為1即可。

代碼:

class Solution {
public:int Sum(int n){int sum = 0;while(n){int i = n % 10;sum += i * i;n /= 10;}return sum;}bool isHappy(int n) {int slow = n, fast = Sum(n); // 這里可不能 fast == n, 因為while的判斷條件是slow == fastwhile(slow != fast){slow = Sum(slow);fast = Sum(Sum(fast));}return slow == 1;}
};

11 盛最多水的容器

在這里插入圖片描述

個人解

思路:
在這里插入圖片描述
每次讓短的邊移動。
移動完成后,重新計算容積V的大小,如果更大就替換

用時:10:00(通過,因為這題以前寫過)
屎山代碼:

class Solution {
public:int maxArea(vector<int>& height) {int ans = 0, left = 0, right = height.size() - 1;while(left < right){int v = min(height[left], height[right]) * (right - left);if(v > ans) ans = v;else{if(height[left] < height[right]){left++;}else{right--;}}}return ans;}
};

時間復雜度:O(n)
空間復雜度:O(1)


優質解:

個人解已經比較優秀的解法了,不再過多探索


611. 有效三角形的個數

在這里插入圖片描述

個人解

思路:通過枚舉 最大邊 + 相向指針 求解。

  1. 先對數組進行排序,整個數組遞增
  2. 枚舉最大邊cur,然后設置雙指針:right = cur - 1left = 0
  3. 要滿足可以形成三角形,就需要兩個短邊之和 > 最大邊
  4. 又因為數組有遞增性,如果當前的left,right,cur所指向的三個數可以形成三角形,則rightleftright之間的所有數組合也可以形成三角形,因為這些值>=left指向的值。
  5. 雙指針的移動問題,要滿足nums[left] + nums[right] > nums[cur],很明顯:left左移,會讓左式更大,right右移會讓左式更小。所以當不滿足條件的時候,left左移,當滿足條件以后right右移。

但是,我在做題的時候一開始嘗試 枚舉最小邊 + 相向指針 出現了問題:如果我枚舉的是最小邊,則要滿足:nums[right] - nums[left] < nums[cur],這時候因為數組是遞增的,就出現了問題。因為right左移,左式會變小,left右移左式也會變小,變化相同顯然是行不通的。

用時:18:00
屎山代碼(通過):

class Solution {
public:int triangleNumber(vector<int>& nums) {int ans = 0, n = nums.size();ranges::sort(nums); // ranges 是 C++20 引入的ranges庫for(int cur = n - 1; cur > 1; cur--) // 枚舉最長邊{int left = 0, right = cur - 1;while(left < right){if(nums[left] + nums[right] > nums[cur]){ans += right - left;right--;}else{left++;}}}return ans;}
};

時間復雜度:O( n 2 n^2 n2)
空間復雜度:O(1)


優質解:

枚舉最小邊的處理方法:
用同向雙指針(滑動窗口)。
leftright的指針越靠近的時候,兩邊的差值越小。
我們可以,一開始讓rightleft足夠接近,讓[left, right]這個窗口里面的組合都滿足nums[right] - nums[left] < nums[cur],即:可以構成三角形
如何實現呢?
只需要在滿足nums[right] - nums[left] < nums[cur]的時候,讓left右移,移動到第一個滿足的地方就停下來,然后統計窗口內滿足的個數,加入ans一組算完以后,讓right右移變遠,但是left無須倒退,因為right增大了,左式增大,這時候要找的是讓左式更小的left(這個很關鍵,不然容易寫成O( n 3 n^3 n3),我就是,進行了回退…),進行下一組的計算。

代碼:

class Solution {
public:int triangleNumber(vector<int>& nums) {int ans = 0, n = nums.size();ranges::sort(nums); // ranges 是 C++20 引入的ranges庫for(int cur = 0 ; cur < n - 2; cur++) // 枚舉最短邊{int left = cur + 1;for(int right = cur + 2; right < n; right++){while(left < right && nums[right] - nums[left] >= nums[cur]){left++;}ans += right - left;}}return ans;}
};

時間復雜度:O( n 2 n^2 n2)
空間復雜度:O(1)


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

吉爾吉斯斯坦工商會代表團赴齊河德瑞新能源汽車考察

德州齊河&#xff0c;2025年4月15日電 時中美貿易突變之際&#xff0c;乘國家一帶一路之風。 展中國新能源之宏圖&#xff0c;塑國貿體系之新方向。 今日上午&#xff0c;吉爾吉斯斯坦共和國工商會代表團一行三人受邀抵達濟南&#xff0c;開啟對德瑞新能源科技有限公司&…

【記錄condapack打包環境到超算上順利運行】

以安裝CLRNet為例子 本地Linux系統上的操作步驟。 由于官方的安裝包的步驟&#xff0c;執行condapack的時候會報錯&#xff0c;所以使用以下步驟進行安裝包。 安裝其他 Python 依賴包 pip install -r requirements.txt? 二、構建并打包項目&#xff08;核心步驟&#xff…

Windows OpenUtau-v0.1.529-開源歌曲合成軟件[提供MIDI編輯、歌詞調整、音色修改 等功能,音樂創作者的必備工具]

Windows OpenUtau 鏈接&#xff1a;https://pan.xunlei.com/s/VONy_Refvo6_813Ig--nu5_rA1?pwdejzc# 引擎&#xff08;Resampler&#xff09;和拼接器&#xff08;Wavtool&#xff09;是UTAU協議中音頻處理的兩大組件。前端編輯器通過調用引擎和拼接器&#xff0c;對音頻進行…

虛擬卡可以解決訂閱 ChatGPT 時無法付款的問題

在全球掀起 AI 熱潮的今天&#xff0c;因為工作的需要有些朋友要用ChatGPT&#xff0c;它也成為了不少人日常學習、工作、創作和編程的得力助手。然而&#xff0c;不少用戶在嘗試訂閱 ChatGPT Plus&#xff08;付費版&#xff09;時&#xff0c;卻遇到了一個令人頭疼的問題——…

設計模式之狀態模式:優雅管理對象行為變化

引言 狀態模式&#xff08;State Pattern&#xff09;是一種行為型設計模式&#xff0c;它允許對象在其內部狀態改變時改變它的行為&#xff0c;使對象看起來似乎修改了它的類。狀態模式將狀態轉移邏輯和狀態相關行為封裝在獨立的狀態類中&#xff0c;完美解決了復雜條件判斷問…

【算法】歸并排序

算法系列七&#xff1a;歸并排序 一、歸并排序的遞歸探尋 1.思路 2.搭建 2.1設計過掉不符情況&#xff08;在最底層時&#xff09; 2.2查驗能實現基礎排序&#xff08;在最底層往上點時&#xff09; 2.3跳轉結果繼續往上回搭 3.實質 4.實現 二、遞歸的調用棧 1.遞歸的…

線束線纜從二維設計到虛擬驗證全流程解決方案

一、傳統設計中的痛點 線纜的開發設計是橫跨多專業多學科的龐大工程&#xff0c;通常會劃分為幾大階段逐次推進&#xff0c;由于每個階段的工作任務不同&#xff0c;所以在不同設計階段使用的工具也完全不同&#xff0c;由此導致整個設計流程中工程師常常要跨平臺協作&#xf…

【智駕中的大模型 -1】自動駕駛場景中的大模型

1. 前言 我們知道&#xff0c;大模型現在很火爆&#xff0c;尤其是 deepseek 風靡全球后&#xff0c;大模型毫無疑問成為為中國新質生產力的代表。百度創始人李彥宏也說&#xff1a;“2025 年可能會成為 AI 智能體爆發的元年”。 隨著科技的飛速發展&#xff0c;大模型的影響…

個人博客系統后端 - 注冊登錄功能實現指南

一、功能概述 個人博客系統的注冊登錄功能包括&#xff1a; 用戶注冊&#xff1a;新用戶可以通過提供用戶名、密碼、郵箱等信息創建賬號用戶登錄&#xff1a;已注冊用戶可以通過用戶名和密碼進行身份驗證&#xff0c;獲取JWT令牌身份驗證&#xff1a;使用JWT令牌訪問需要認證…

投行交易與風控系統的消費側冪等架構設計與實戰

1.背景和痛點 1.1 資金操作敏感性場景 核心需求&#xff1a; 交易唯一性&#xff1a;資金類操作必須保證全局唯一執行計算原子性&#xff1a;風控指標計算需具備事務性特征審計追溯&#xff1a;所有操作需保留完整冪等軌跡 1.2 業務損失統計 二、技術挑戰與架構設計 2.1 分…

odoo-046 視圖顯示的 name 數據庫中存儲的不一樣

文章目錄 一、問題由來二、排查經過1. 問 deepseek2. 驗證3. 新問題 三、 總結四、補充&#xff08;翻譯模型 ir.translation 中 src 和 value 字段詳解&#xff09; 一、問題由來 客戶有多個公司&#xff0c;使用多個數據庫。他們有時需要同步不同數據庫之間的數據的需求。在…

充電寶項目:規則引擎Drools學習

文章目錄 規則引擎 Drools1 問題2 規則引擎概述2.1 規則引擎2.2 使用規則引擎的優勢2.3 規則引擎應用場景2.4 Drools介紹 3 Drools入門案例3.1 創建springboot項目 引入依賴3.2 添加Drools配置類3.4 創建實體類Order3.5 orderScore.drl3.6 編寫測試類 4 Drools基礎語法4.1 規則…

HTML、CSS 和 JavaScript 常見用法及使用規范

一、HTML 深度剖析 1. 文檔類型聲明 HTML 文檔開頭的 <!DOCTYPE html> 聲明告知瀏覽器當前文檔使用的是 HTML5 標準。它是文檔的重要元信息&#xff0c;能確保瀏覽器以標準模式渲染頁面&#xff0c;避免怪異模式下的兼容性問題。 2. 元數據標簽 <meta> 標簽&am…

基于CNN+ViT的蔬果圖像分類實驗

本文只是做一個簡單融合的實驗&#xff0c;沒有任何新穎&#xff0c;大家看看就行了。 1.數據集 本文所采用的數據集為Fruit-360 果蔬圖像數據集&#xff0c;該數據集由 Horea Mure?an 等人整理并發布于 GitHub&#xff08;項目地址&#xff1a;Horea94/Fruit-Images-Datase…

Ubuntu24.04安裝libgl1-mesa-glx 報錯,軟件包缺失

在 Ubuntu 24.04 系統中&#xff0c;您遇到的 libgl1-mesa-glx 軟件包缺失問題可能是由于該包在最新的 Ubuntu 版本中被重命名為 libglx-mesa0。以下是針對該問題的詳細解決方案&#xff1a; 1. 問題原因分析 包名稱變更&#xff1a;在 Ubuntu 24.04 中&#xff0c;libgl1-me…

webpack vite

? 1、webpack webpack打包工具&#xff08;重點在于配置和使用&#xff0c;原理并不高優。只在開發環境應用&#xff0c;不在線上環境運行&#xff09;&#xff0c;壓縮整合代碼&#xff0c;讓網頁加載更快。 前端代碼為什么要進行構建和打包&#xff1f; 體積更好&#x…

如何在爬蟲中合理使用海外代理?在爬蟲中合理使用海外ip

我們都知道&#xff0c;爬蟲工作就是在各類網頁中游走&#xff0c;快速而高效地采集數據。然而如果目標網站分布在多個國家或者存在區域性限制&#xff0c;那靠普通的網絡訪問可能會帶來諸多阻礙。而這時&#xff0c;“海外代理”儼然成了爬蟲工程師們的得力幫手&#xff01; …

數據倉庫分層存儲設計:平衡存儲成本與查詢效率

數據倉庫分層存儲不僅是一個技術問題,更是一種藝術:如何在有限的資源下,讓數據既能快速響應查詢,又能以最低的成本存儲? 目錄 一、什么是數據倉庫分層存儲? 二、分層存儲的體系架構 1. 數據源層(ODS,Operational Data Store) 2. 數據倉庫層(DW,Data Warehouse)…

YOLO學習筆記 | 基于YOLOv8的植物病害檢測系統

以下是基于YOLOv8的植物病害檢測系統完整技術文檔,包含原理分析、數學公式推導及代碼實現框架。 基于YOLOv8的智能植物病害檢測系統研究 摘要 針對傳統植物病害檢測方法存在的效率低、泛化性差等問題,本研究提出一種基于改進YOLOv8算法的智能檢測系統。通過設計輕量化特征提…

高級語言調用C接口(二)回調函數(4)Python

前面2篇分別說了java和c#調用C接口&#xff0c;參數為回調函數&#xff0c;回調函數中參數是結構體指針。 接下來說下python的調用方法。 from ctypes import * import sysclass stPayResult(Structure):_pack_ 4 # 根據實際C結構體的對齊方式設置&#xff08;常見值為1,4,…