有序數組,距離目標最近的k個數 二分查找

? 🤔 新手做題思路:

? 第1步:理解題目

? - 找距離x最近的k個數
- 數組已排序
- 返回結果也要排序(升序)
- 距離相同時,選擇較小的數

? 第2步:關鍵insight

? - 數組已排序 → 考慮二分查找
- 最近的k個數一定是連續的k個數 → 考慮滑動窗口/雙指針
- 只需要找到這個連續區間的起始位置

數組排序和二分查找有關 ,注意滑動窗口不用排序

指定的子串長度和滑動窗口有關

? 第3步:核心思想

? 最近的k個數字一定形成一個長度為k的連續子數組,問題轉化為:
在所有長度為k的子數組中,找到距離x總和最小的那個

● 💡 解題方法(從簡單到優化):

? 方法1:暴力法(新手先理解這個)

? def findClosestElements_brute(arr, k, x):# 計算每個元素與x的距離,然后排序distances = []for num in arr:distances.append((abs(num - x), num))# 按距離排序,距離相同時按值排序distances.sort(key=lambda item: (item[0], item[1]))# 取前k個元素result = [item[1] for item in distances[:k]]# 返回排序結果return sorted(result)

? 方法2:雙指針法(推薦理解)

? def findClosestElements_two_pointers(arr, k, x):left, right = 0, len(arr) - 1# 收縮到k個元素while right - left >= k:# 比較左右邊界哪個離x更遠,移除更遠的if abs(arr[left] - x) > abs(arr[right] - x):left += 1elif abs(arr[left] - x) < abs(arr[right] - x):right -= 1else:# 距離相同,移除更大的數if arr[left] > arr[right]:left += 1else:right -= 1return arr[left:right + 1]

? 方法3:二分查找(最優解)

? def findClosestElements_binary(arr, k, x):# 二分查找最佳起始位置left, right = 0, len(arr) - kwhile left < right:mid = (left + right) // 2# 比較mid位置和mid+k位置哪個更適合作為起點# 如果x離右邊界更近,說明最佳區間應該右移if x - arr[mid] > arr[mid + k] - x:left = mid + 1else:right = midreturn arr[left:left + k]

? 🔍 詳細解析雙指針法(最容易理解):

? 核心思想:

? - 初始時:左指針=0,右指針=n-1(包含所有元素)
- 目標:縮小到恰好k個元素
- 策略:每次移除距離x最遠的邊界元素

? 手動模擬:

? arr = [1,2,3,4,5], k = 4, x = 3

? 初始: left=0, right=4, 區間=[1,2,3,4,5] (5個元素)
比較: |1-3|=2 vs |5-3|=2,距離相等,移除較大的5
結果: left=0, right=3, 區間=[1,2,3,4] (4個元素) ?

? 完整代碼實現:

● def findClosestElements(arr, k, x):
"""
推薦的雙指針解法
時間復雜度: O(n)
空間復雜度: O(1)
"""
left, right = 0, len(arr) - 1

? ? ? # 收縮窗口直到剩下k個元素
while right - left + 1 > k:
# 計算左右邊界與x的距離
left_dist = abs(arr[left] - x)
right_dist = abs(arr[right] - x)

? ? ? ? ? if left_dist > right_dist:
# 左邊更遠,移除左邊
left += 1
elif left_dist < right_dist:
# 右邊更遠,移除右邊
right -= 1
else:
# 距離相等,移除數值更大的(題目要求)
if arr[left] > arr[right]:
left += 1
else:
right -= 1

? ? ? return arr[left:right + 1]

? # 測試
print(findClosestElements([1,2,3,4,5], 4, 3)) ? ? ?# [1,2,3,4]
print(findClosestElements([1,1,2,3,4,5], 4, -1)) ?# [1,1,2,3]

? 🚀 二分查找優化版(面試加分):

? def findClosestElements_optimal(arr, k, x):
"""
二分查找最優起始位置
時間復雜度: O(log n)
空間復雜度: O(1)
"""
# 在[0, n-k]范圍內找最佳起始位置
left, right = 0, len(arr) - k

? ? ? while left < right:
mid = (left + right) // 2

? ? ? ? ? # 關鍵判斷:比較mid和mid+k位置
# 如果x更靠近右邊界,說明最優區間應該右移
if x - arr[mid] > arr[mid + k] - x:
left = mid + 1
else:
right = mid

? ? ? return arr[left:left + k]

? 🎯 復雜度對比:

? | 方法 ? | 時間復雜度 ? ? ?| 空間復雜度 | 難度 ?|
|------|------------|-------|-----|
| 暴力法 ?| O(n log n) | O(n) ?| ? ? |
| 雙指針 ?| O(n) ? ? ? | O(1) ?| ?? ?|
| 二分查找 | O(log n) ? | O(1) ?| ??? |

? 📝 考試建議:

? 優先掌握雙指針法:
- 思路清晰,容易理解
- 代碼簡潔,不容易出錯
- 時間復雜度已經很好了

? 二分查找法作為加分項:
- 面試時展現算法功底
- 但邏輯相對復雜,容易出錯

? ★ Insight ─────────────────────────────────────
這道題的關鍵洞察是:最近的k個元素必然是連續的。因為如果不連續,中間跳過的元素肯定比端點的某個元素更接近x,這與最優性矛盾。基于這個洞察,問題就轉化為尋找最
優的連續k元素子數組,可以用雙指針或二分查找來高效求解。
─────────────────────────────────────────────────

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

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

相關文章

學習心得分享

我認為知識是一定要系統化的學習&#xff0c;結構化梳理&#xff0c;這樣在運用或思考的時候&#xff0c;能夠回憶起自己在這一塊梳理的知識結構&#xff0c;如果有記錄那么能快速回憶并理解&#xff0c;如果沒有記錄&#xff0c;那么說明對自己來說超綱了&#xff0c;把知識進…

為什么說 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天這個全球化的商業戰場上&#xff0c;中國企業的出海已從“選擇題”變為“必答題”。當我們滿懷雄心&#xff0c;將產品和業務推向海外市場時&#xff0c;基礎設施的選擇&#xff0c;往往是決定成敗的第一步。它不僅關乎成本與性能&#xff0c;更直接影響著團隊的開發效率…

NSSCTF每日一題_Web_[SWPUCTF 2022 新生賽]奇妙的MD5

為了保持做題的感覺和持續學習&#xff0c;也就有了每日一題系列&#xff0c;選一些有意義的題目或者一些CTF新穎題目作為參考學習。[SWPUCTF 2022 新生賽]奇妙的MD51. 訪問首頁界面并進行分析估計題目MD5提示,查詢得知ffifdyop 這個字符串是一個奇妙的MD5字符串因為將“ffifdy…

服務器IP暴露被攻擊了怎么辦?

當服務器IP暴露后&#xff0c;可能會面臨各種網絡攻擊&#xff0c;如DDoS攻擊、端口掃描、惡意入侵等&#xff0c;這將嚴重影響服務器的正常運行和數據安全。本文將從檢測攻擊類型、采取緊急防護措施、優化服務器配置、尋求專業支持以及預防未來攻擊五個方面&#xff0c;詳細探…

TDengine 時間函數 TIMETRUNCATE 用戶手冊

TDengine TIMETRUNCATE 函數用戶使用手冊 函數概述 TIMETRUNCATE 是 TDengine 中的一個時間處理標量函數&#xff0c;用于將時間戳按照指定的時間單位進行截斷操作。該函數在時間數據聚合、分組和統計分析中非常有用&#xff0c;特別適用于智能電表等時序數據的分析場景。 語…

Linux電腦怎樣投屏到客廳的大電視?支持遠程投屏嗎?

一般的電腦投屏軟件都會推出Windows版本和macOS版本&#xff0c;雖然這兩個版本已經覆蓋大部分消費者的常用電腦&#xff0c;但是依然有一部分群體因為電腦系統版本問題不能使用投屏軟件。 如果你當前使用的是Linux系統的電腦&#xff0c;而且又要將電腦投屏投屏到客廳的大電視…

MP4視頻太大如何壓縮?分享6種簡單便捷的壓縮小技巧

隨著拍攝高清視頻的設備越來越多&#xff0c;我們經常會遇到MP4視頻文件體積過大的問題&#xff0c;無論是上傳到社交平臺、發送給朋友&#xff0c;還是存儲在設備中&#xff0c;過大的視頻文件都會帶來諸多不便。那么&#xff0c;MP4視頻太大怎么壓縮呢&#xff1f;本文將介紹…

k8s 部署 redis

創建部署文件 vim redis.yaml添加如下內容&#xff1a; apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建議生產環境使用更復雜的密碼 ---…

FFMPEG H264

一、H264壓縮編碼1.1 H264 中的 I 幀、P幀和 B幀H264 使用幀內壓縮和幀間壓縮的方式提高編碼壓縮率&#xff1b;H264 采用了獨特的 I 幀、P 幀和 B 幀策略來實現&#xff0c;連續幀之間的壓縮&#xff1b;1.2 其他概念GOP&#xff08;圖像組&#xff09;&#xff1a;一個IDR幀到…

Unity 解決天空盒中間出現一條線

問題解決找到天空盒對應貼圖&#xff0c;在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾選即可。效果動態修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();

Python爬蟲實戰:研究Showcase模塊,構建電商平臺銷售數據采集和分析系統

1. 引言 1.1 研究背景 在數字經濟快速發展的今天,電商平臺積累了海量的商品信息、交易數據和用戶反饋,這些數據蘊含著豐富的市場洞察。根據中國電子商務研究中心數據,2024 年我國網絡零售市場規模突破 15 萬億元,平臺商品數據呈現指數級增長。如何高效提取這些數據并轉化…

C++中的Reactor和Proactor模型進行系統性解析

<摘要> 本解析系統闡述了網絡編程中Reactor與Proactor兩種高性能I/O模型的核心概念。Reactor基于同步I/O多路復用&#xff0c;通過事件循環分發通知&#xff0c;由應用層自行完成I/O操作&#xff1b;而Proactor則基于異步I/O&#xff0c;由操作系統完成I/O操作后主動回調…

【技術教程】如何將文檔編輯器集成至基于Node.js的網頁應用程序中

當今數字化時代&#xff0c;Web應用對在線文檔編輯的需求日益增長。無論是構建在線辦公系統、內容管理平臺還是協作工具&#xff0c;讓用戶能夠直接在瀏覽器中編輯和處理文檔已成為基本需求。 想知道如何為你的 Node.js 應用添加強大的在線文檔編輯功能嗎&#xff1f;本文手把…

[論文閱讀] 人工智能 + 軟件工程 | 別讓AI寫的代碼帶“漏洞”!無觸發投毒攻擊的防御困境與啟示

別讓AI寫的代碼帶“漏洞”&#xff01;無觸發投毒攻擊的防御困境與啟示 論文信息 原標題&#xff1a;Evaluating Defenses Against Trigger-Free Data Poisoning Attacks on NL-to-Code Models&#xff08;評估NL-to-Code模型應對無觸發數據投毒攻擊的防御方法&#xff09;主要…

【Windows】通過 runas 命令實現多用戶權限測試的完整流程

? 目錄 ?&#x1f6eb; 導讀需求1?? 前期準備&#xff1a;創建管理員/普通測試用戶1.1 創建普通用戶Test&#xff08;無管理員權限&#xff09;1.2 創建管理員用戶Admin&#xff08;含管理員權限&#xff09;2?? 核心操作&#xff1a;通過runas命令切換用戶命令行環境2.1…

新后端漏洞(上)- H2 Database Console 未授權訪問

漏洞介紹&#xff1a; H2 database是一款Java內存數據庫&#xff0c;多用于單元測試。 H2 database自帶一個Web管理頁面&#xff0c;在Spirng開發中&#xff0c;如果我們設置如下選項&#xff0c;即可允許外部用戶訪問Web管理頁面&#xff0c;且沒有鑒權&#xff1a; spring.h2…

2025-09-04 HTML3——區塊布局與表單

文章目錄1 塊元素與行內元素1.1 塊元素 (Block-level Element)1.2 行內元素 (Inline Element)2 HTML 布局2.1 使用 <div> 元素2.2 使用 <table> 元素3 表單 (<form>)3.1 輸入域&#xff08;<input>&#xff09;3.1.1 文本域&#xff08;Text Fields&am…

云數據庫服務(參考自騰訊云計算工程師認證課程)更新中......

數據庫基礎介紹面臨的挑戰&#xff1a;數據庫系統架構&#xff1a; 數據庫DB、數據庫管理系統DBMS&#xff08;負責數據庫的搭建、使用和維護的系統軟件&#xff0c;通過組織、索引、查詢、修改數據庫文件、實現數據定義、組織、存儲、管理以及數據庫操作、運行和維護等主要功能…

源滾滾AI編程SillyTavern酒館配置Claude Code API教程

什么是酒館 SillyTavern&#xff08;簡稱 ST&#xff09;是一款本地安裝的用戶界面&#xff0c;讓你能夠與文本生成大模型&#xff08;LLM&#xff09;、圖像生成引擎以及語音合成&#xff08;TTS&#xff09;模型進行交互。我們的目標是盡可能賦予用戶對 LLM 提示詞的最大掌控…

軟件設計師——軟件工程學習筆記

軟件工程 一、軟件工程基礎知識 1. 軟件的生存周期&#xff08;1&#xff09;可行性分析與項目開發計劃。這個階段主要確定軟件的開發目標及其可行性。參與該階段的人員有用戶、項目負責人、系統分析師。產生的文檔有 可行性分析報告、項目開發計劃。 &#xff08;2&#xff09…