【算法學習】兩數之和II - 輸入有序數組

題目描述

原題鏈接

給你一個下標從 1 開始的整數數組 numbers ,該數組已按 非遞減順序排列 ,請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1]numbers[index2] ,則 1 <= index1 < index2 <= numbers.length

以長度為 2 的整數數組 [index1, index2] 的形式返回這兩個整數的下標 index1index2

你可以假設每個輸入 只對應唯一的答案 ,而且你 不可以 重復使用相同的元素。

你所設計的解決方案必須只使用常量級的額外空間。

示例 1:

輸入:numbers = [2,7,11,15], target = 9
輸出:[1,2]
解釋: 27 之和等于目標數 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2]

示例 2:

輸入:numbers = [2,3,4], target = 6
輸出:[1,3]
解釋:24 之和等于目標數 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3]

示例 3:

輸入:numbers = [-1,0], target = -1
輸出:[1,2]
解釋:-10 之和等于目標數 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2]

提示:

  • 2 <= numbers.length <= 3 * 104
  • -1000 <= numbers[i] <= 1000
  • numbers非遞減順序 排列
  • -1000 <= target <= 1000
  • 僅存在一個有效答案

雙指針法

思路分析

我們觀察題目可以發現,數組是已經排好序的,那么我們可以直接定義兩個元素來分別指向 數組頭數組尾 ,然后循環使兩個指針移動,直到最終算出我們需要的結果。

假設左指針為start,右指針為end,并將左右指針所對應的元素的和設為sum,那么我們就可以發現:

  • sum==target 時,就可以得到我們需要的結果
  • sum>target 時,我們需要將右指針對應的元素變小一些,那么就需要 將右指針向左移動一個元素,也就是 end--
  • sum<target 時,我們需要將左指針對應的元素變大一些,那么就需要 將左指針向右移動一個元素,也就是 start++

我們可以通過下圖來理解這個規律。

圖解

雙指針法.gif

代碼實現

public int[] twoSum(int[] numbers, int target) {if (null == numbers) {return new int[0];}int start = 0;int end = numbers.length - 1;while (start < end) {int sum = numbers[start] + numbers[end];if (sum == target) {return new int[]{start + 1, end + 1};} else if (sum > target) {end--;} else {start++;}}return new int[0];
}

二分查找法

思路分析

那么我們將題目帶入,假設左指針為 start,右指針為 end,并將左右指針中間的下標為 middle,即可得到:

  • numbers[middle]==target 時,我們即可得到需要的結果
  • numbers[middle]>target 時,說明 中間數大于預期結果,結果在左半部分,那么我們需要 將右指針移動至middle的位置,并重新取middle的位置。
  • numbers[middle]<target 時,說明 中間數小于預期結果,結果在右半部分,那么我們需要 將左指針移動至middle的位置,并重新取middle的位置。

我們通過下圖來理解。

圖解

1692181098346.gif

代碼實現

public int[] twoSum(int[] numbers, int target) {if (null == numbers) {return new int[0];}for (int i = 0; i < numbers.length; ++i) {int start = i + 1;int end = numbers.length - 1;while (start <= end) {int middle = (end - start) / 2 + start;if (numbers[middle] == target - numbers[i]) {return new int[]{i + 1, middle + 1};} else if (numbers[middle] > target - numbers[i]) {end = middle - 1;} else {start = middle + 1;}}}return new int[0];}

總結

我們使用了兩種寫法來完成這個題目:雙指針法二分查找法

其中在 雙指針法 中,數組最多遍歷n次,則時間復雜度為 O(n) ,空間復雜度為O(1) 。

二分查找法 中,遍歷數組的時間復雜度為 O(n) ,二分查找來尋找參數的時間復雜度為 O ( l o g n ) O(log_n) O(logn?) ,所以在該題目中,總時間復雜度為 O ( n l o g n ) O(nlog_n) O(nlogn?) ,空間復雜度為O(1) 。


推薦

關注博客和公眾號獲取最新文章

Bummon’s Blog | Bummon’s Home | 公眾號

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

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

相關文章

Springboot MultipartFile文件上傳與下載

yml文件配置是否可以上傳及上傳附件大小 servlet:multipart:# 允許文件上傳enabled: true# 單個文件大小max-file-size: 20MB# 設置總上傳的文件大小max-request-size: 50MB /*** param files* param request* Description 上傳文件* Throws* Return java.util.List* Date 202…

南大通用數據庫(Gbase 8s) 創建UDR外部函數

一、在使用 date_format、from_unixtime、to_days、yearweek 函數時&#xff0c;Gbase 8s 數據庫不支持&#xff0c;可以使用創建 UDR 外部函數來實現 二、登錄命令控制臺或者使用 navicat 連接 Gbase 數據庫 這里使用 navicat &#xff0c;點擊新增連接選擇 PostGreSql 驅動…

動手學深度學習—卷積神經網絡LeNet(代碼詳解)

1. LeNet LeNet由兩個部分組成&#xff1a; 卷積編碼器&#xff1a;由兩個卷積層組成&#xff1b;全連接層密集塊&#xff1a;由三個全連接層組成。 每個卷積塊中的基本單元是一個卷積層、一個sigmoid激活函數和平均匯聚層&#xff1b;每個卷積層使用55卷積核和一個sigmoid激…

LeetCode--HOT100題(35)

目錄 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09;題目接口解題思路1代碼解題思路2代碼 PS: 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合…

UDP 的報文結構以及注意事項

UDP協議 1.UDP協議端格式 1.圖中的16位UDP長度,表示整個數據報(UDP首部UDP數據)的最大長度 2.若校驗和出錯,會直接丟棄 2.UDP的報文結構 UDP報文主體分為兩個部分:UDP報頭(占8個字節)UDP載荷/UDP數據 1.源端口號 16位,2個字節 2.目的端口號 16位,2個字節 3.包長度 指示了…

sd-webui安裝comfyui擴展

文章目錄 導讀ComfyUI 環境安裝1. 安裝相關組件2. 啟動sd-webui3. 訪問sd-webui 錯誤信息以及解決辦法 導讀 這篇文章主要給大家介紹如何在sd-webui中來安裝ComfyUI插件 ComfyUI ComfyUI是一個基于節點流程式的stable diffusion的繪圖工具&#xff0c;它集成了stable diffus…

兩個list如何根據一個list中的屬性去過濾掉另一個list中不包含這部分的屬性,用流實現

你可以使用Java 8的流來實現這個功能。假設你有兩個包含對象的List&#xff0c;每個對象有一個屬性&#xff0c;你想根據一個List中的屬性值來過濾掉另一個List中不包含這個屬性值的對象。下面是一種使用流的方式來實現這個功能 import java.util.ArrayList; import java.util…

什么是閉包(closure)?為什么它在JavaScript中很有用?

聚沙成塔每天進步一點點 ? 專欄簡介? 閉包&#xff08;Closure&#xff09;是什么&#xff1f;? 閉包的用處? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&…

IO流面試題

題目一&#xff1a; 在磁盤中新建一個文件(如果目錄結構不存在&#xff0c;則創建目錄) 文件名&#xff1a;data.txt 文件日錄&#xff1a;C:\demo\test\files (盤符不限) linux目錄~/demo/test/files 題二 在新建的data.txt中添加如下內容&#xff1a; 張三,測試,2019-02-18 …

windows10 安裝WSL2, Ubuntu,docker

AI- 通過docker開發調試部署ChatLLM 閱讀時長&#xff1a;10分鐘 本文內容&#xff1a; window上安裝ubuntu虛擬機&#xff0c;并在虛擬機中安裝docker&#xff0c;通過docker部署數字人模型&#xff0c;通過vscode鏈接到虛擬機進行開發調試.調試完成后&#xff0c;直接部署在云…

優漫動游零基礎如何學習好UI設計

智能時代的來臨&#xff0c;很多企業都越來越注重用戶體驗這一塊&#xff0c;想要有一個吸引用戶的好頁面&#xff0c;UI設計師崗位不可或缺&#xff0c;如今越來越多的人想要學習UI設計技術&#xff0c;那么對于零基礎小白如何學習好UI設計呢? 零基礎小白如何學習好UI設計…

變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐

目錄導讀 變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐1. 什么是變更通知2. 變更通知的場景分析3. 變更通知的技術方案3.1 變更通知的技術實現方案 4. 變更通知的最佳實踐總結5. 參考資料 變更通知在開源SpringBoot/SpringCloud微服務中的最佳實踐 1. 什么是變更通…

Ubuntu在自己的項目中使用pcl

1、建立一個文件夾&#xff0c;如pcl_demos&#xff0c;里面建立一個.cpp文件和一個cmake文件 2、打開終端并進入該文件夾下&#xff0c;建立一個build文件夾存放編譯的結果并進入該文件夾 3、對上一級進行編譯 cmake .. 4、生成可執行文件 make 5、運行該可執行文件 6、可視…

最強自動化測試框架Playwright(30)-JS句柄

在 Playwright 中&#xff0c;JSHandle 是一個表示瀏覽器中 JavaScript 對象的類。它提供了與網頁中的 JavaScript 對象進行交互和操作的方法。 可以通過調用 Playwright中的 evaluateHandle 或 evaluate 方法來獲取 JSHandle from playwright.sync_api import sync_playwrig…

微服務中間件-分布式緩存Redis

分布式緩存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 兩者對比 b.Redis主從1) 搭建主從架構2) 數據同步原理&#xff08;全量同步&#xff09;3) 數據同步原理&#xff08;增量同步&#xff09; c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

金融語言模型:FinGPT

項目簡介 FinGPT是一個開源的金融語言模型&#xff08;LLMs&#xff09;&#xff0c;由FinNLP項目提供。這個項目讓對金融領域的自然語言處理&#xff08;NLP&#xff09;感興趣的人們有了一個可以自由嘗試的平臺&#xff0c;并提供了一個與專有模型相比更容易獲取的金融數據。…

Java根據List集合中的一個字段對集合進行去重

利用HashSet 創建了一個HashSet用于存儲唯一的字段值&#xff0c;并創建了一個新的列表uniqueList用于存儲去重后的對象。遍歷原始列表時&#xff0c;如果字段值未在HashSet中出現過&#xff0c;則將其添加到HashSet和uniqueList中。 List<Person> originalList new Ar…

VS2015項目中,MFC內存中調用DLL函數(VC6生成的示例DLL)

本例主要講一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部內容&#xff0c;VC2015項目加載內存中的DLL函數&#xff0c;并調用函數的示例。 本例中的示例代碼下載&#xff0c;點擊可以下載 一、VC6.0生成示例DLL項目 1.新建項目&#xff0c;…

mysql中的is null和空字符串

相比于oracle&#xff0c;mysql中的is null 和空坑就沒那么多&#xff0c;直接寫就行。 不為空 and (username is not null and username !)注&#xff1a; 不為空中間用的是and。 為空 and (username is null or username !)注&#xff1a; 為空中間用的是or。

java應用運行在docker,并且其他組件也在docker

docker啟動redis容器 # create redis docker run -d --name redis-container -p 6379:6379 redis:latest創建java 應用 dockerfile FROM openjdk:17##Pre-create related directories RUN mkdir -p /data/etax/ms-app WORKDIR /data/etax/ms-appEXPOSE 10133 COPY ./target…