求解數組中N數之和最接近目標值的算法詳解

目錄

  1. 問題定義
  2. 問題背景
  3. 常見解決思路
    • 暴力枚舉法
    • 排序+雙指針法
    • 動態規劃法
  4. 具體實現方法
    • 暴力枚舉法的實現
    • 排序+雙指針法的實現
    • 動態規劃法的實現
  5. 優化技巧
  6. 總結

問題定義

給定一個整數數組 nums 和一個目標值 target,需要在數組中找到 n 個數,使得這 n 個數的和最接近目標值 target。換句話說,需要找到使 |sum(nums[i1], nums[i2], ..., nums[in]) - target| 最小的 n 個數。

輸入

  • 一個整數數組 nums
  • 一個整數 target
  • 一個整數 n

輸出

  • 一個整數,即找到的 n 個數的和

示例

輸入:nums = [1, 2, 3, 4, 5], target = 10, n = 3
輸出:9
解釋:數組中找到3個數(2, 3, 4),使得它們的和最接近10。最接近的和是9。

問題背景

在實際應用中,類似的問題常見于金融、電子商務和數據分析等領域。例如,在金融投資中,我們可能希望從一組投資機會中選擇若干個,使得總投資額最接近我們的預算;在電子商務中,可能希望從商品列表中選擇若干商品,使得總價格最接近客戶的預期花費。

解決該問題的算法不僅僅限于數組中選取 n 個數,還可以擴展到處理其他復雜數據結構和約束條件的問題。因此,理解并掌握該問題的解決方法具有重要的實際意義。

常見解決思路

暴力枚舉法

暴力枚舉法是最直接且容易理解的方法。其基本思路是枚舉數組中所有可能的 n 個數的組合,計算它們的和,并找出與目標值 target 差值最小的組合。

優點
  • 簡單易懂,直接枚舉所有可能性,確保找到最優解。
缺點
  • 計算量巨大,時間復雜度為 O(C(m, n)),其中 m 是數組的長度,C(m, n) 是從 m 個數中選取 n 個數的組合數。當數組長度較大時,計算非常耗時,不適用于實際應用。

排序+雙指針法

排序加雙指針法常用于解決類似兩數之和、三數之和等問題。其基本思路是首先對數組進行排序,然后使用雙指針技巧,在排序后的數組中尋找最接近目標值的組合。

優點
  • 相對于暴力枚舉法,計算量大大減少。
  • 對于兩數之和、三數之和等特殊情況,效果顯著。
缺點
  • 需要對數組進行排序,增加了時間復雜度。
  • 對于一般的 n 數之和問題,雙指針法不易直接應用,需要進行一定的變形和優化。

動態規劃法

動態規劃法通過構建和維護一個狀態表,逐步逼近問題的最優解。其基本思路是將問題拆解為若干子問題,并通過記錄和重用子問題的解,減少計算量。

優點
  • 能有效處理較復雜的問題。
  • 適用于一些特殊約束條件的問題。
缺點
  • 狀態表的構建和維護復雜度較高。
  • 對于較大規模的問題,可能需要較多的存儲空間。

具體實現方法

暴力枚舉法的實現

實現思路

暴力枚舉法的核心是枚舉所有可能的 n 個數的組合,然后計算它們的和,與目標值 target 比較,記錄最接近的組合。

實現步驟
  1. 使用 Python 的 itertools.combinations 枚舉數組中所有可能的 n 個數的組合。
  2. 遍歷所有組合,計算它們的和,與目標值 target 比較,記錄最接近的組合。
  3. 返回最接近的組合的和。
示例代碼
import itertoolsdef closest_sum(nums, target, n):closest_sum = float('inf')closest_combination = Nonefor combination in itertools.combinations(nums, n):current_sum = sum(combination)if abs(current_sum - target) < abs(closest_sum - target):closest_sum = current_sumclosest_combination = combinationreturn closest_sum# 示例
nums = [1, 2, 3, 4, 5]
target = 10
n = 3
print(closest_sum(nums, target, n))  # 輸出:9

排序+雙指針法的實現

實現思路

對于兩數之和、三數之和等特例,排序+雙指針法是一種高效的解決方案。其核心思想是在排序后的數組中,通過雙指針移動,找到最接近目標值的組合。

實現步驟
  1. 對數組進行排序。
  2. 對于每一個固定的元素,使用雙指針法在剩余元素中尋找兩數之和最接近目標值的組合。
  3. 不斷更新最接近的組合,直到遍歷完整個數組。
  4. 返回最接近的組合的和。
示例代碼
def closest_sum(nums, target, n):nums.sort()closest_sum = float('inf')def k_sum_closest(nums, target, k):if k == 2:return two_sum_closest(nums, target)closest = float('inf')for i in range(len(nums) - k + 1):if i > 0 and nums[i] == nums[i - 1]:continuecurrent = nums[i] + k_sum_closest(nums[i + 1:], target - nums[i], k - 1)if abs(current - target) < abs(closest - target):closest = currentreturn closestdef two_sum_closest(nums, target):left, right = 0, len(nums) - 1closest = float('inf')while left < right:current_sum = nums[left] + nums[right]if abs(current_sum - target) < abs(closest - target):closest = current_sumif current_sum < target:left += 1else:right -= 1return closestreturn k_sum_closest(nums, target, n)# 示例
nums = [1, 2, 3, 4, 5]
target = 10
n = 3
print(closest_sum(nums, target, n))  # 輸出:9

動態規劃法的實現

實現思路

動態規劃法通過構建和維護一個狀態表,逐步逼近問題的最優解。其基本思路是將問題拆解為若干子問題,并通過記錄和重用子問題的解,減少計算量。

實現步驟
  1. 定義狀態:dp[i][j] 表示前 i 個元素中選擇 j 個數的和的所有可能值。
  2. 初始化狀態表,處理邊界情況。
  3. 遍歷數組,更新狀態表。
  4. 從狀態表中找到最接近目標值的組合的和。
  5. 返回最接近的組合的和。
示例代碼
def closest_sum(nums, target, n):dp = [set() for _ in range(n + 1)]dp[0].add(0)for num in nums:for j in range(n, 0, -1):for prev_sum in list(dp[j - 1]):dp[j].add(prev_sum + num)closest_sum = float('inf')for sum_ in dp[n]:if abs(sum_ - target) < abs(closest_sum - target):closest_sum = sum_return closest_sum# 示例
nums = [1, 2, 3, 4, 5]
target = 10
n = 3
print(closest_sum(nums, target, n))  # 輸出:9

優化技巧

剪枝策略

在枚舉過程中,可以通過一定的剪枝策略減少無效計算。例如,如果當前組合的和已經大于目標值,可以提前結束該組合的計算。

記憶化搜索

在遞歸過程中,使用記憶化搜索技術,將已經計算過的結果存儲起來,避免重復計算,從而提高算法效率。

近似算法

對于一些規模較大的問題,可以采用近似算法,通過一定的近似計算,快速得到一個較為接近的解。

總結

本文詳細介紹了求解數組中 n 數之和最接近目標值的常見算法,包括暴力枚舉法、排序+雙指針法和動態規劃法。通過對比這些算法的優缺點,可以根據具體問題選擇合適的算法進行求解。同時,本文還介紹了一些優化技巧,幫助提高算法效率。希望讀者通過本文的學習,能夠深入理解該問題并掌握相關算法的應用。

在實際應用中,選擇合適的算法和優化策略,不僅可以提高計算效率,還能有效解決實際問題。希望本文對讀者有所幫助,并激發讀者在算法和數據結構領域的進一步探索和研究。

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

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

相關文章

apollo 環境配置

輸入法 安裝輸入google pinyin法 sudo apt install fcitx-bin sudo apt install fcitx-table sudo apt-get install fcitx fcitx-googlepinyin -y 最后需要reboot 系統環境 修改文件夾名稱為英文 將Ubuntu主文件夾里的中文文件夾名稱改成英文_番茄炒雞蛋z的博客-CSDN博客…

selenium中switch_to.window切換窗口的用法

打開百度多個窗口&#xff0c;遍歷切換每個窗口&#xff0c;切到【百度地圖】就停止。 使用了driver.switch_to.window&#xff08;&#xff09; 來切換&#xff0c; 參數是handle值 from selenium import webdriver import time# 創建瀏覽器驅動對象 from selenium.webdrive…

JSQLParser用于解析SQL語句并創建抽象語法樹(AST)

JSQLParser簡介 JSQLParser是一個Java庫&#xff0c;用于解析SQL語句并創建抽象語法樹(AST)。該庫非常強大&#xff0c;可以解析大多數標準SQL語法&#xff0c;并支持許多數據庫的專用語法。 主要特點 語法支持廣泛&#xff1a;支持大多數SQL語法&#xff0c;包括SELECT、IN…

java中事務中遇到鎖會造成什么問題,以及該如何解決?

在spring中實現事務有多種方式&#xff0c;主要是兩種&#xff1a;一種是聲明式事務&#xff0c;一種是編程式事務&#xff0c;今天我們就講聲明式事務中的一種&#xff0c;使用注解Transactional&#xff0c;這個注解的作用就是幫助我們在代碼執行完畢之后自動提交事務&#x…

淘寶評論數據爬取全攻略

一、淘寶評論數據爬取的背景與意義 隨著互聯網的快速發展&#xff0c;電子商務平臺如淘寶、京東等在我國市場占有率逐年上升。消費者在購買商品時&#xff0c;除了關注商品的價格、質量等因素外&#xff0c;還會參考其他消費者的評價和評論。淘寶評論數據爬取是指通過技術手段…

C# NX二次開發-設置背景顏色

使用UF函數能直接設置UG背景顏色: 1.設置背景顏色選項為純色: 2.編寫更新背景顏色代碼: var nxColor NXColor.Factory._Get(186);var rgb nxColor.GetRgb();double[] arr [rgb.R, rgb.G, rgb.B];theUf.Disp.SetColor(UFConstants.UF_DISP_BACKGROUND_COLOR, UFConstants.UF…

oracle刪除表空間和用戶命令

創建表空間和用戶可參考 ORACLE創建表空間,用戶,修改密碼,分配權限,以及導入導出_oracle表空間的密碼-CSDN博客 1.刪除表空間 --刪除空的表空間&#xff0c;但是不包含物理文件 drop tablespace tablespace_name; --刪除非空表空間&#xff0c;但是不包含物理文件 drop tabl…

化妝品FDA認證需要注意哪方面

化妝品FDA認證概述 化妝品FDA認證是指化妝品產品通過美國食品藥品監督管理局&#xff08;FDA&#xff09;的審核和認證&#xff0c;證明其符合相關法規和標準&#xff0c;具備在美國市場合法銷售的條件。這一認證過程不僅涉及產品的成分合規性&#xff0c;還包括產品的標簽、安…

C#字符串格式化之$語法

引言 字符串是編程中使用較廣的一種數據&#xff0c;它由數字、字母、下劃線等組成。在使用過程中會對字符串進行格式化。在C#語言中&#xff0c;.NET 6及以上使用字符串插值&#xff08;$""語法&#xff09;對字符串格式化。 $語法 .NET 6 及以上提供的一種新的語…

Facebook海外企業廣告賬戶是什么?有什么優勢?

隨著全球化的迅速發展&#xff0c;越來越多國內企業開始將目光轉向海外市場&#xff0c;尋求更為廣闊的商機與更高的發展空間。而在這個全球化的時代&#xff0c;Facebook作為全球最大的社交媒體平臺之一&#xff0c;自然成為了眾多企業進軍海外市場的首選平臺之一。那么如果想…

flask輕松入門,概念講解

Hello World Flask 是輕量級web框架&#xff0c;僅保留了核心功能&#xff1a; 請求響應處理模板渲染URL路由 文章目錄 Hello Worldflask命令模式python命令模式兩種模式對比修改入口文件配置flask命令修改python命令修改 修改端口和地址flask命令修改python命令修改 修改 URL …

java——順序表

前言&#xff1a;順序表是線性表的一種&#xff0c;它是較于數組更加靈活的一種儲存方式。線性表通常是邏輯上是連續的一條直線&#xff0c;但在物理上不是連續的。java中已經實現好了一個順序表&#xff0c;搭配泛型可以支持各種類型的使用&#xff0c;下面就來介紹該如何使用…

以太網:ARP和信息處理狀態機+代碼實現

ARP過程只需要一次發送和一次接受就可以完成了&#xff1b; 在實際實現協議棧的時候我個人認為要以主動ARP開始&#xff1b; 主動ARP&#xff1a;發送一次ARP請求&#xff0c;接受一個ARP報文&#xff1b; 使用這種方式的原因是上位機可能不知道你的IP地址&#xff08;當然如…

Mysql疑難報錯排查 - Field ‘XXX‘ doesn‘t have a default value

項目場景&#xff1a; 數據庫環境 &#xff1a;mysql8; 工程使用&#xff1a;MyBatisPlus 表情況&#xff1a; 問題描述 某一個插入語句使用了 MyBatisPlus 的 save 方法&#xff0c;因為end_time1 end_time2都并沒有值&#xff0c;所以在MyBatisPlus默認情況下&#xff0c;…

如何使自己寫的代碼易讀易懂?

〓● 如果代碼可讀性不佳、不容易理解&#xff0c;可能造成如下問題&#xff1a; 〓? 其他工程師浪費時間解讀它&#xff1b; 〓? 誤解導致引入缺陷&#xff1b; 〓? 其他工程師修改時破壞代碼。 〓● 提高代碼可讀性&#xff0c;有時候可能使其變得更為冗長、占用更多的…

【Python】深入認識Python數據類型和變量

???? 文章目錄 1. 引言數據類型的重要性Python中的數據類型概述 2. 數字類型整型&#xff08;int&#xff09;浮點型&#xff08;float&#xff09;復數&#xff08;complex&#xff09; 3. 字符串類型字符串的定義與使用字符串操作方法 4. 布爾類型布爾值和布爾運算 5. 列…

docker網絡詳解

1. 網絡模式 1.1 網絡結構 當安裝Docker以后&#xff0c;會自動創建三個網絡。可以使用docker network ls命令列出這些網絡。 $ docker network ls NETWORK ID NAME DRIVER SCOPE 440aefe8afa3 bridge bridge local aa8d6325580f host host …

02JAVA字符串和集合

1.字符串 1.String 介紹: String在java.lang包下,使用不需要導包,String代表字符串,帶""字符串都是String類的對象 字符串的特點: 字符串不可變,他們的值在創建后不能被改變 字符串效果相當于(char[]),底層原理是字節數組(byte[]) String構造方法: String 變量名 ne…

chat-glm4,qwen1.5性能對比

modelMMLUC-EvalGSM8KHumanEvalglm-4-9b74.777.184.070.1qwen1.5-7b6174.162.536.0qwen1.5-14b67.678.770.137.8 數據來源是以下兩個圖。可以看到GLM4非常優秀&#xff0c;qwen應該也快要開源自己的新模型了&#xff0c;希望國內的大模型團隊能夠繼續堅持&#xff0c;持續努力&…

AI框架之Spring AI與Spring Cloud Alibaba AI使用講解

文章目錄 1 AI框架1.1 Spring AI 簡介1.2 Spring AI 使用1.2.1 pom.xml1.2.2 可實現的功能 1.3 Spring Cloud Alibaba AI1.4 Spring Cloud Alibaba AI 實踐操作1.4.1 pom.xml1.4.2 配置文件1.4.3 對接文本模型1.4.4 文生圖模型1.4.5 語音合成模型 1 AI框架 1.1 Spring AI 簡介…