相向雙指針-16. 最接近的三數之和

16. 最接近的三數之和

  • 題目描述
  • 思路講解
  • 代碼展示
  • 復雜度分析
  • 相關標簽

題目描述

在這里插入圖片描述

思路講解

思路和 15. 三數之和 類似,排序后,枚舉 nums[i] 作為第一個數,那么問題變成找到另外兩個數,使得這三個數的和與 target 最接近,這同樣可以用雙指針解決。

設 s=nums[i]+nums[j]+nums[k],為了判斷 s 是不是與 target 最近的數,我們還需要用一個變量 minDiff 維護 ∣s?target∣ 的最小值。分類討論:

  1. 如果 s=target,那么答案就是 s,直接返回 s。
  2. 如果 s>target,那么如果s?target<minDiff,說明找到了一個與 target 更近的數,更新 minDiff 為 s?target,更新答案為s。然后和三數之和一樣,把 k 減一。
  3. 否則 s<target,那么如果 target?s<minDiff,說明找到了一個與target 更近的數,更新 minDiff 為 target?s,更新答案為 s。然后和三數之和一樣,把 j 加一。

除此以外,還有以下幾個優化:

  1. 設 s=nums[i]+nums[i+1]+nums[i+2]。如果s>target,由于數組已經排序,后面無論怎么選,選出的三個數的和不會比 s 還小,所以不會找到比 s 更優的答案了。所以只要s>target,就可以直接 break 外層循環了。在 break 前判斷 s 是否離 target 更近,如果更近,那么更新答案為s。
  2. 設 s=nums[i]+nums[n?2]+nums[n?1]。如果 s<target,由于數組已經排序,nums[i]加上后面任意兩個數都不超過 s,所以下面的雙指針就不需要跑了,無法找到比 s 更優的答案。但是后面還有更大的nums[i],可能找到一個離 target 更近的三數之和,所以還需要繼續枚舉,continue 外層循環。在 continue前判斷 s 是否離 target 更近,如果更近,那么更新答案為 s,更新 minDiff 為 target?s。
  3. 如果 i>0 且 nums[i]=nums[i?1],那么 nums[i]和后面數字相加的結果,必然在之前算出過,所以無需跑下面的雙指針,直接 continue 外層循環。(可以放在循環開頭判斷。)

代碼展示

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n = len(nums)min_diff = inffor i in range(n - 2):x = nums[i]if i and x == nums[i - 1]:continue # 優化三# 優化一s = x + nums[i + 1] + nums[i + 2]if s > target: # 后面無論怎么選,選出的三個數的和不會比 s 還小if s - target < min_diff:ans = s # 由于下一行直接 break,這里無需更新 min_diffbreak# 優化二s = x + nums[-2] + nums[-1]if s < target:# x 加上后面任意兩個數都不超過 s,所以下面的雙指針就不需要跑了if target - s < min_diff:min_diff = target - sans = scontinue# 雙指針j, k = i + 1, n - 1while j < k:s = x + nums[j] + nums[k]if s == target:return sif s > target:if s - target < min_diff: # s 與 target 更近min_diff = s - targetans = sk -= 1else:if target - s < min_diff: # s 與 target 更近min_diff = target - sans = sj += 1return ans

復雜度分析

  1. 時間復雜度:O( n 2 n^2 n2),其中 n 為 nums 的長度。排序 O(nlogn)。外層循環枚舉第一個數,然后O(n)雙指針。所以總的時間復雜度為 O( n 2 n^2 n2)。
  2. 空間復雜度:O(1)。返回值不計入,忽略排序的棧開銷。

相關標簽

  • 數組
  • 雙指針
  • 排序

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

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

相關文章

C 語 言 - - - 文 件 操 作

C 語 言 - - - 文 件 操 作 文 件文 件 名文 件 操 作fopenfclose 文 件 的 順 序 讀 寫fputcfgetcfputsfgetsfprintffscanffwritefread 流文 件 的 隨 機 讀 寫fseekftellrewind 總結 &#x1f4bb;作 者 簡 介&#xff1a;曾 與 你 一 樣 迷 茫&#xff0c;現 以 經 驗 助 你…

Walrus 與 Pudgy Penguins 達成合作,為 Web3 頭部 IP 引入去中心化存儲

以將深受喜愛的數字藏品賦予生命而聞名的 IP 與品牌開發公司 Pudgy Penguins&#xff0c;現已集成 Walrus&#xff0c;用于存儲和管理其日益增長的數字媒體資源庫&#xff0c;包括在其產品和社區體驗中使用的貼紙和 GIF。團隊將率先通過 Tusky&#xff08;Walrus 的用戶友好型文…

2019ICPC陜西省賽暨陜西邀請賽題解 BCDEF HIJKL

共111支隊伍&#xff0c;獲獎情況&#xff08;大概&#xff09; 銅牌66 —— 3 296 銀牌33 —— 4 391 金牌 11 —— 6 808 題目難度&#xff08;過題&#xff09;L F E B C I J D K H Problem - L - Codeforces 思路&#xff1a;注意到答案是連乘&#xff0c;只要有0…

5塊錢的無憂套餐卡可以變成流量卡嗎

電信的 5 塊錢無憂套餐卡理論上可以變成流量卡&#xff0c;但會受到一些條件限制&#xff0c;以下是具體介紹&#xff1a; 中國電信無憂卡簡介 中國電信無憂卡是電信推出的低月租套餐&#xff0c;月租僅 5 元&#xff0c;包含 200M 國內流量、來電顯示和 189 郵箱&#xff0c;全…

SpringBoot校園失物招領平臺源碼開發實現

概述 實用的??SpringBoot校園失物招領平臺??完整項目源碼&#xff0c;幫助開發者快速構建校園失物招領系統。該項目采用SpringBootVue前后端分離架構&#xff0c;包含完整的注冊登錄、信息發布、認領管理等模塊&#xff0c;是學習企業級項目開發的優秀范例 主要內容 1. …

如何在純C中實現類、繼承和多態(小白友好版)

基本實現原理 /* 通過結構體函數指針模擬類 */ typedef struct {// 成員變量int x; // 成員方法&#xff08;函數指針&#xff09; void (*print)(void* self); } MyClass;/* 成員函數實現 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…

51單片機入門教程——每個音符對應的重裝載值

前言 本教程基于B站江協科技課程進行個人學習整理&#xff0c;專為擁有C語言基礎的零基礎入門51單片機新手設計。既幫助解決因時間差導致的設備迭代調試難題&#xff0c;也助力新手快速掌握51單片機核心知識&#xff0c;實現從C語言理論到單片機實踐應用的高效過渡 。

股票單因子的檢驗方法有哪些?

股票單因子的檢驗方法主要包括以下四類方法及相關指標&#xff1a; 一、統計指標檢驗 IC值分析法 定義&#xff1a;IC值&#xff08;信息系數&#xff09;衡量因子值與股票未來收益的相關性&#xff0c;包括兩種計算方式&#xff1a; Normal IC&#xff1a;基于Pearson相關系數…

洛谷 P8606 [藍橋杯 2013 國 B] 高僧斗法 博弈論

題目 傳送門 P8606 [藍橋杯 2013 國 B] 高僧斗法 - 洛谷 思路 這個題就比較考驗博弈的基本題型和轉換能力了&#xff1b; 這個題是nim博弈>階梯博弈 再將小和尚的移動轉化為階梯上石子的移動&#xff1a;兩個小和尚之間可以移動的距離&#xff0c;看做階梯上的石子&…

《政治最后的日子》章節

政治與中世紀教會的類比性衰落 作者提出現代民族國家正重復中世紀教會的衰落軌跡&#xff1a; 兩者均曾作為社會組織核心存在約5個世紀 晚期都成為生產力阻礙&#xff08;中世紀教會稅收負擔/現代國家官僚低效&#xff09; 末期均出現管理者普遍腐敗與公眾蔑視&#xff08;…

微軟開源推理模型:Phi-4-reasoning-plus

Phi-4-reasoning-plus 技術解讀 一、模型概述 Phi-4-reasoning-plus 是微軟研究院開發的一種前沿開源推理模型&#xff0c;基于 Phi-4 通過監督微調和強化學習進一步訓練而成。該模型專注于高質量和高級推理能力的培養&#xff0c;旨在為小型高效模型提供強大的推理性能。其訓…

文學與社會學是否只是在做解釋的工作?

目錄 一、文學&#xff1a;從抒情到解釋的轉變 &#xff08;一&#xff09;文學從來不只是“虛構” &#xff08;二&#xff09;文學的解釋&#xff0c;是“經驗的再組織” 二、社會學&#xff1a;用理論語言重寫社會現實 &#xff08;一&#xff09;社會學的“科學化”與…

Flink基礎整理

文章目錄 前言1.Flink系統架構2.編程模型(API層次結構)3.DataSet和DataStream區別4.Flink的批流統一5.Flink的狀態后端6.Flink有哪些狀態類型7.Flink并行度前言 提示:下面是根據網絡或AI整理: 1.Flink系統架構 用戶在客戶端提交作業(Job)到服務端。服務端為分布式的主從…

mq消息可靠性傳送

mq消息傳送 開啟消息發布確認模式 def publish(self, message):"""發布消息&#xff08;自動重連&#xff09;"""for i in range(3):try:message_ json.dumps(message, ensure_asciiFalse)self.ensure_connection()# 開啟 confirm 模式&#x…

【quantity】10 面積單位模塊(area.rs)

一、源碼 我們可以實現面積單位文件&#xff0c;包含k&#xff08;千&#xff09;、d&#xff08;分&#xff09;、c&#xff08;厘&#xff09;、m&#xff08;毫&#xff09;前綴的面積量。面積的基本單位是平方米&#xff08;SquareMeter&#xff09;。 以下是area.rs的實…

運算放大器的主要技術指標

運放&#xff08;運算放大器&#xff09;是一種基礎電子器件&#xff0c;具有輸入阻抗高、開環放大倍數大、輸入端電流小、同相端與反相端電壓幾乎相等等特點。在選型時&#xff0c;需要考慮技術指標如輸入失調電壓、輸入失調電壓漂移、輸入失調電流、共模抑制比、壓擺率、建立…

Docker 服務搭建

&#x1f4a2;歡迎來到張翊塵的開源技術站 &#x1f4a5;開源如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 Docker 服務搭建在 Ubuntu 上安裝 Docker更新軟件…

CRM系統接入DeepSeek大模型應用場景方案

1. 項目背景與目標 在當前數字化轉型的浪潮中&#xff0c;客戶關系管理&#xff08;CRM&#xff09;系統已成為企業提升客戶服務效率、優化銷售流程的核心工具。然而&#xff0c;傳統CRM系統普遍面臨數據處理能力有限、客戶洞察深度不足、響應效率低下等問題。例如&#xff0c…

步進電機中斷函數解釋

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函數逐行解釋 下面我們對 STM32 項目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函數進行逐行解析&#xff0c;幫助初學者理解每一行代碼的作用。此函數是在定時器產生更新中斷時被調…

什么是Linux中的systemd?

寫在前面 為什么要回過頭來復習linux的system的&#xff0c;最近在研究DELL EMC的PowerStore存儲系統&#xff0c;其底層是基于CoreOS開發的&#xff0c;這套操作系統是基于Systemd來設計的。所以要深入了解PowerStore就必須對systemd做詳細了解。 systemd 是一個用于 Linux …