基礎算法--雙指針

兩數之和

點擊:題目鏈接

?解法一:暴力解法

時間復雜度:O(N^2)

算法思路:兩層for循環即可列出所有兩個數字的組合,判斷是否等于目標值

算法流程:

兩層 for 循環: 外層 for 循環依次枚舉第?個數 a ;

內層 for 循環依次枚舉第?個數 b ,讓它與 a 匹配;

ps :這?有個魔?細節:我們挑選第?個數的時候,可以不從第?個數開始選,因為 a 前 ?的數我們都已經在之前考慮過了;因此,我們可以從 a 往后的數開始列舉。

然后將挑選的兩個數相加,判斷是否符合?標值。

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int n = price.size();for(int a = 0;a<n;a++){for(int b = 1;b<n;b++){if(price[a]+price[b]==target){return {price[a],price[b]};}}}return{-1,-1};}
};

會超時

解法二:雙指針?

時間復雜度:O(N)

算法思路: 注意到本題是升序的數組,因此可以?「對撞指針」優化時間復雜度。

算法流程(附帶算法分析,為什么可以使?對撞指針):

a. 初始化 left,right 分別指向數組的左右兩端(這里不是我們理解的指針,而是數組的下標)

b. 當 left < right 的時候,一直循環。
i. 當 nums [left] + nums [right] == target 時,說明找到結果,記錄結果,并且返回;
ii. 當 nums [left] + nums [right] < target 時:

  • 對于 nums [left] 而言,此時 nums [right] 相當于 nums [left] 能碰到的最大值(別忘了,這里是升序數組哈~)。如果此時不符合要求,說明在這個數組里面,沒有別的數符合 nums [left] 的要求了(最大的數都滿足不了你,你已經沒救了)。因此,我們可以大膽舍去這個數,讓 left++,去比較下一組數據;
  • 那對于 nums [right] 而言,由于此時兩數之和是小于目標值的,nums [right] 還可以選擇比 nums [left] 大的值繼續努力達到目標值,因此 right 指針我們按兵不動;
    iii. 當 nums [left] + nums [right] > target 時,同理我們可以舍去 nums [right](最小的數都滿足不了你,你也沒救了)。讓 right--,繼續比較下一組數據,而 left 指針不變(因為他還是可以去匹配 nums [right] 更小的數的)。

代碼:

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0,right = price.size()-1;while(left<right){if(price[left]+price[right]>target){right--;}    else if(price[left]+price[right]<target){left++;}else{return {price[left],price[right]};}}return{-1,-1};}
};

三數之和

點擊:題目鏈接

算法思路:

本題與兩數之和類似,是非常經典的面試題。

與兩數之和稍微不同的是,題目中要求找到所有 “不重復” 的三元組。那我們可以利用在兩數之和那里用的雙指針思想,來對我們的暴力枚舉做優化:
i. 先排序;
ii. 然后固定一個數 a:
iii. 在這個數后面的區間內,使用 “雙指針算法” 快速找到兩個數之和等于 -a 即可。

但是要注意的是,這道題里面需要有 “去重” 操作~
i. 找到一個結果之后,left 和 right 指針要 “跳過重復” 的元素;
ii. 當使用完一次雙指針算法之后,固定的 a 也要 “跳過重復” 的元素。

這里算法思想不難,需要注意一些極端情況的處理,比如{0,0,0},這里需要處理好你的邊界。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//先排序sort(nums.begin(),nums.end());//返回的是一個二維vector<vector<int>> vt;int i = 0,left = 1,right = nums.size()-1;//雙指針for(i = 0;i<nums.size()-2;i++)//固定數a{if(nums[i]>0){break;//小優化}left = i+1;right = nums.size()-1;while(left<right){if(nums[left]+nums[right]>-nums[i]){right--;}else if(nums[left]+nums[right]<-nums[i]){left++;}else if(nums[left]+nums[right]==-nums[i]){vt.push_back({ nums[i],nums[left],nums[right] });//去重//考慮相同數字,只能單邊跳,不要兩邊一起跳,否則會少算一些組合//注意left+1可能越界while(left<right&&nums[left]==nums[left+1]){left++;}//right-1同理while(left<right&&nums[right]==nums[right-1]){right--;}left++;right--;}}//i+1也可能越界while(i<nums.size()-2&&nums[i+1]==nums[i]){i++;}}return vt;}
};

四數之和

點擊:題目鏈接

算法思路:?和上題基本一樣,不過這道題可能會有一點小坑,這里出現了4個數相加會大于INT_MAX的情況,所以需要處理一下,去重操作基本可上題一樣。

a.依次固定?個數 a ;

b.在這個數 a 的后?區間上,利?「三數之和」找到三個數,使這三個數的和等于 target - a 即可。

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>> vt;int a,b,c,d;for(a=0;a<nums.size();a++){if(nums.size()<3){break;}for(b = a+1;b<nums.size()-2;b++){c = b+1;d = nums.size()-1;while(c<d){long max = (long)nums[c]+nums[d];if(nums[a]+nums[b]==target-max){vt.push_back({nums[a],nums[b],nums[c],nums[d]});while(c<d&&nums[c]==nums[c+1]){c++;}while(c<d&&nums[d]==nums[d-1]){d--;}c++;d--;}else if(nums[a]+nums[b]<target-max){c++;}else{d--;}}while(b<nums.size()-2&&nums[b]==nums[b+1]){b++;}}while(a<nums.size()-3&&nums[a]==nums[a+1]){a++;}}return vt;}
};

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

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

相關文章

什么是Linux系統架構?

? Linux系統架構是指Linux操作系統的整體結構和工作層次&#xff0c;它定義了系統組件如何交互、如何管理硬件資源&#xff0c;以及用戶如何通過不同的層次與系統進行交互。Linux架構通常有兩種劃分方法&#xff1a;系統層次架構和功能層次架構&#xff0c;兩者都可以很好地描…

spring6:4、原理-手寫IoC

目錄 4、原理-手寫IoC4.1、回顧Java反射4.2、實現Spring的IoC 4、原理-手寫IoC 我們都知道&#xff0c;Spring框架的IOC是基于Java反射機制實現的&#xff0c;下面我們先回顧一下java反射。 4.1、回顧Java反射 Java反射機制是在運行狀態中&#xff0c;對于任意一個類&#x…

不是“我應該做什么”,而是“我想做什么”

1. 識別內心的渴望 首先&#xff0c;我們需要識別自己真正的愿望和激情所在。這可能需要一些時間和自我反思。問自己&#xff1a;在沒有任何外界壓力的情況下&#xff0c;我真正想做的是什么&#xff1f;是賺錢、生活、旅行、追星&#xff0c;還是其他什么&#xff1f;識別這些…

30天學會Go--第7天 GO語言 Redis 學習與實踐

30天學會Go–第7天 GO語言 Redis 學習與實踐 文章目錄 30天學會Go--第7天 GO語言 Redis 學習與實踐前言一、Redis 基礎知識1.1 Redis 的核心特性1.2 Redis 常見使用場景 二、安裝 Redis2.1 在 Linux 上安裝2.2 在 Windows 上安裝2.3 使用 Docker 安裝 Redis 三、Redis 常用命令…

Vue項目開發 如何實現父組件與子組件數據間的雙向綁定?

在 Vue.js 中&#xff0c;實現父組件與子組件數據之間的雙向綁定&#xff0c;可以通過以下幾種方式。下面我將介紹幾種常見的方法&#xff0c;并解釋它們的實現原理和適用場景。 1. 使用 v-model 實現雙向綁定 v-model 是 Vue.js 中最常見的雙向綁定方式&#xff0c;它可以使…

React第十七章(useRef)

useRef 當你在React中需要處理DOM元素或需要在組件渲染之間保持持久性數據時&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 訪問ref的值 類似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…

【C++】內存分布、new、delete、 operator new、operator delete

內存分布 在C語言和C中&#xff0c;程序內存被劃分成六個部分&#xff1a; 內核空間、棧、內存映射段、堆、數據段、代碼段 棧&#xff1a;又稱堆棧&#xff0c;主要為非靜態局部變量、函數參數、返回值等&#xff0c;棧的生長方向是向下生長的 內存映射段&#xff1a;高效的…

代碼隨想錄算法訓練營day37|動態規劃part5

今天的幾道題目都比較簡單&#xff0c;思路也比較相似&#xff0c;都是利用完全背包。完全背包和01背包的不同點在于完全背包每個元素可以取多次&#xff0c;而01背包只能取1次&#xff0c;所以在dp一維數組遍歷時&#xff0c;完全背包仍然要從前往后遍歷&#xff0c;并且無論是…

混合云策略在安全領域受到青睞

Genetec 發布了《2025 年物理安全狀況報告》&#xff0c;該報告根據超過 5,600 名該領域領導者&#xff08;其中包括 100 多名來自澳大利亞和新西蘭的領導者&#xff09;的回應&#xff0c;揭示了物理安全運營的趨勢。 報告發現&#xff0c;澳大利亞和新西蘭的組織采用混合云策…

FastAPI解決跨域報錯net::ERR_FAILED 200 (OK)

目錄 一、跨域問題的本質 二、FastAPI中的CORS處理 1. 安裝FastAPI和CORS中間件 2. 配置CORS中間件 3. 運行FastAPI應用 三、解決跨域報錯的步驟 四、案例:解決Vue.js與FastAPI的跨域問題 1. Vue.js前端應用 2. FastAPI后端API 3. 配置CORS中間件 4. 運行和測試 五…

為什么 JavaScript 中的 `new` 運算符報錯?

在 JavaScript 中&#xff0c;new 運算符通常用于創建一個新對象并調用構造函數來初始化對象。然而&#xff0c;new 運算符可能會引發一些錯誤&#xff0c;通常是由于以下原因導致的&#xff1a; 構造函數沒有正確的定義&#xff1a; 如果使用 new 運算符調用的函數沒有正確地定…

霍爾效應電流傳感器

適用于大電流&#xff0c;低功耗的電流檢測&#xff1a; TVS選型: RS232的隔離電路: 單片機采集200伏高壓 如何做隔離電路&#xff1a; 采用線性光電耦合器HCNR200實現高壓直流母線電壓的精確采樣。還是用電阻分壓&#xff0c;只是在ADC檢測階段加上隔離芯片&#xff1a;

如何設置Java爬蟲的異常處理?

在Java爬蟲中設置異常處理是非常重要的&#xff0c;因為網絡請求可能會遇到各種問題&#xff0c;如連接超時、服務器錯誤、網絡中斷等。通過合理的異常處理&#xff0c;可以確保爬蟲的穩定性和健壯性。以下是如何在Java爬蟲中設置異常處理的步驟和最佳實踐&#xff1a; 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

環境 rook-ceph 部署的 ceph。 問題 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…

【計網筆記】習題

物理層 不屬于物理層接口規范定義范疇的是&#xff08;C&#xff09; A. 接口形狀 B. 引腳功能 C. 物理地址 D. 信號電平 【2023-912】光網絡只能通過導向型介質傳播。&#xff08;&#xff09; 【2017-408】若信道在無噪聲情況下的極限數據傳輸速率不小于信噪比為30dB條件下的…

最新 AI 編程工具全面對比:v0、Bolt.new、Cursor、Windsurf

隨著人工智能的快速發展&#xff0c;越來越多的 AI 驅動的開發工具應運而生&#xff0c;旨在提升開發效率、優化開發流程&#xff0c;并減輕開發者的工作負擔。在這個背景下&#xff0c;四款新興的 AI 編程工具&#xff1a;v0、Bolt.new、Cursor 和 Windsurf&#xff0c;各具特…

【C++算法】35.位運算_兩整數之和

文章目錄 題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a; 題目鏈接&#xff1a; 371. 兩整數之和 題目描述&#xff1a; 解法 筆試的話直接 return ab&#xff1b; 接下來講一下這題的解法&#xff1a; 位運算&#xff08;異或運算-無進位相加&#xff…

PyCharm+Selenium+Pytest配置小記

1、下載ChromeDriver&#xff1a; Chrome130以后的Driver下載&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome瀏覽器的版本&#xff1a;設置-->關于 Chrome&#xff1b; &…

【C++】虛函數

類中聲明函數成員的時候&#xff0c;在函數的前面加上virtual關鍵字&#xff0c;則該成員為虛函數 虛函數的特點 如果在類中定義的虛函數&#xff0c;那么系統會為這個類維護一個虛函數表類中會多出4個字節的指針去指向這個虛函數表&#xff0c;在虛函數表中保存了虛函數的首…

如何在UI自動化測試中創建穩定的定位器?

如何在UI自動化測試中創建穩定的定位器&#xff1f; 前言1. 避免使用絕對路徑2. 避免在定位器中使用索引3. 避免多個類名的定位器4. 避免動態和自動生成的ID5. 確保定位器唯一6. 處理隱藏元素的策略7. 謹慎使用基于文本的定位器8. 使用AI創建穩定的定位器 總結 前言 在自動化測…