雙指針用法練習題(2024/5/26)

1三數之和

給你一個整數數組?nums?,判斷是否存在三元組?[nums[i], nums[j], nums[k]]?滿足?i != ji != k?且?j != k?,同時還滿足?nums[i] + nums[j] + nums[k] == 0?。請

你返回所有和為?0?且不重復的三元組。

注意:答案中不可以包含重復的三元組。

示例 1:

輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
解釋:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。
注意,輸出的順序和三元組的順序并不重要。

示例 2:

輸入:nums = [0,1,1]
輸出:[]
解釋:唯一可能的三元組和不為 0 。

示例 3:

輸入:nums = [0,0,0]
輸出:[[0,0,0]]
解釋:唯一可能的三元組和為 0 。

思路:

首先將數組排序,然后有一層for循環,i從下標0的地方開始,同時定一個下標left 定義在i+1的位置上,定義下標right 在數組結尾的位置上。

在數組中找到 abc 使得a + b +c =0,我們這里相當于 a = nums[i],b = nums[left],c = nums[right]。

接下來如何移動left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就說明 此時三數之和大了,因為數組是排序后了,所以right下標就應該向左移動,這樣才能讓三數之和小一些。

如果 nums[i] + nums[left] + nums[right] < 0 說明 此時 三數之和小了,left 就向右移動,才能讓三數之和大一些,直到left與right相遇為止。

本題解題思路重點是去重:
  1. 外層循環中的條件判斷:在每次循環開始時,通過判斷當前數字與前一個數字是否相同來避免重復計算相同的數字。如果當前數字與前一個數字相同,則跳過當前循環,繼續下一個數字的處理。
    if(i > 0 && nums[i] == nums[i - 1])continue;

  2. 內層循環中的去重操作:在找到符合條件的三元組后,通過向右移動左指針和向左移動右指針,并跳過與移動后相同的元素,來避免重復。
    while(left < right && nums[left] == nums[left + 1])left++;while(left < right && nums[right] == nums[right - 1])right--;

完整代碼:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans; // 用于存儲結果的二維向量// 對數組進行排序,方便后續操作sort(nums.begin(), nums.end());// 遍歷數組for(int i = 0; i < nums.size(); i++) {// 避免重復計算相同的數字if(i > 0 && nums[i] == nums[i - 1])continue;int left = i + 1; // 左指針,指向當前數字的下一個位置int right = nums.size() - 1; // 右指針,指向數組末尾int target = 0 - nums[i]; // 目標值為當前數字的相反數// 在左右指針沒有相遇的情況下進行查找while(left < right) {// 如果找到了三個數的和等于目標值if(nums[left] + nums[right] == target) {// 將結果加入到答案中ans.push_back({nums[i], nums[left], nums[right]});// 繼續查找下一個不同的左指針值while(left < right && nums[left] == nums[left + 1])left++;// 繼續查找下一個不同的右指針值while(left < right && nums[right] == nums[right - 1])right--;// 向中間收縮left++;right--;} // 如果三數之和小于目標值,則左指針向右移動else if(nums[left] + nums[right] < target) {left++;} // 如果三數之和大于目標值,則右指針向左移動else {right--;}}}return ans; // 返回結果}
};

2四數之和

給你一個由?n?個整數組成的數組?nums?,和一個目標值?target?。請你找出并返回滿足下述全部條件且不重復的四元組?[nums[a], nums[b], nums[c], nums[d]]?(若兩個四元組元素一一對應,則認為兩個四元組重復):

  • 0 <= a, b, c, d?< n
  • abc?和?d?互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按?任意順序?返回答案 。

示例 1:

輸入:nums = [1,0,-1,0,-2,2], target = 0
輸出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

輸入:nums = [2,2,2,2,2], target = 8
輸出:[[2,2,2,2]]

提示:

  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

思路:

  1. 剪枝處理:在這里,剪枝指的是通過判斷當前數值是否已經大于目標值(或者非負且大于等于目標值),如果是的話就可以跳出循環,因為后面的數值只會更大,不會再符合條件了。這里使用break語句跳出循環,統一通過return返回最終結果。

  2. 對nums[k]去重:這里的去重處理是指如果當前數字與前一個數字相同(除了第一個數字外),則跳過當前循環,繼續下一個數字的處理,以避免重復計算相同的數字。

  3. 2級剪枝處理:類似于剪枝處理,這里也是對兩個數字的和進行判斷,如果已經大于目標值(或者非負且大于等于目標值),則跳出循環,因為后面的數值只會更大,不會再符合條件了。

  4. 對nums[i]去重:與對nums[k]去重類似,這里是對內層循環中的第二個數字進行去重處理,避免重復計算相同的數字。

  5. 對nums[left]和nums[right]去重:在找到符合條件的四元組后,通過向右移動左指針和向左移動右指針,并跳過與移動后相同的元素,來避免重復。

代碼:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 存儲結果的二維向量vector<vector<int>> result;// 對數組進行排序,方便后續處理sort(nums.begin(), nums.end());// 外層循環遍歷數組for (int k = 0; k < nums.size(); k++) {// 剪枝處理:如果當前數字已經大于目標值且為非負數,跳出循環if (nums[k] > target && nums[k] >= 0) {break; // 這里使用break,統一通過最后的return返回}// 對當前數字進行去重處理if (k > 0 && nums[k] == nums[k - 1]) {continue;}// 內層循環遍歷數組for (int i = k + 1; i < nums.size(); i++) {// 2級剪枝處理:如果當前兩個數字的和已經大于目標值且為非負數,跳出循環if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;}// 對第二個數字進行去重處理if (i > k + 1 && nums[i] == nums[i - 1]) {continue;}// 定義左右指針int left = i + 1;int right = nums.size() - 1;// 在左右指針未相遇之前進行循環while (right > left) {// 避免溢出,使用 long 類型進行判斷if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) {right--;} else if ((long) nums[k] + nums[i] + nums[left] + nums[right]  < target) {left++;} else {// 找到符合條件的四元組,加入結果向量result.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});// 對左右指針所指的數字進行去重處理while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案時,雙指針同時收縮right--;left++;}}}}// 返回最終結果return result;}
};

3移除元素

給你一個數組?nums?和一個值?val,你需要?原地?移除所有數值等于?val?的元素。元素的順序可能發生改變。然后返回?nums?中與?val?不同的元素的數量。

假設?nums?中不等于?val?的元素數量為?k,要通過此題,您需要執行以下操作:

  • 更改?nums?數組,使?nums?的前?k?個元素包含不等于?val?的元素。nums?的其余元素和?nums?的大小并不重要。
  • 返回?k

用戶評測:

評測機將使用以下代碼測試您的解決方案:

int[] nums = [...]; // 輸入數組
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 長度正確的預期答案。// 它以不等于 val 的值排序。int k = removeElement(nums, val); // 調用你的實現assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 個元素
for (int i = 0; i < actualLength; i++) {assert nums[i] == expectedNums[i];
}

如果所有的斷言都通過,你的解決方案將會?通過

示例 1:

輸入:nums = [3,2,2,3], val = 3
輸出:2, nums = [2,2,_,_]
解釋:你的函數函數應該返回 k = 2, 并且 nums 中的前兩個元素均為 2。
你在返回的 k 個元素之外留下了什么并不重要(因此它們并不計入評測)。

示例 2:

輸入:nums = [0,1,2,2,3,0,4,2], val = 2
輸出:5, nums = [0,1,4,0,3,_,_,_]
解釋:你的函數應該返回 k = 5,并且 nums 中的前五個元素為 0,0,1,3,4。
注意這五個元素可以任意順序返回。
你在返回的 k 個元素之外留下了什么并不重要(因此它們并不計入評測)。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

思路:

慢指針?slowIndex?指向下一個待賦值的位置,快指針?fastIndex?遍歷數組。當快指針指向的元素不等于目標值時,將其賦值給慢指針指向的位置,并將慢指針向后移動一位。這樣就實現了移除數組中指定值的元素,并且返回新數組的長度

代碼:

class Solution {
public:// 移除元素函數int removeElement(vector<int>& nums, int val) {// 慢指針初始位置int slowIndex = 0;// 快指針遍歷數組for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {// 如果當前值不等于目標值if (val != nums[fastIndex]) {// 將當前值移到慢指針位置,并將慢指針向后移動一位nums[slowIndex++] = nums[fastIndex];}}// 返回新數組的長度return slowIndex;}
};

4反轉字符串

編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組?s?的形式給出。

不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。

示例 1:

輸入:s = ["h","e","l","l","o"]
輸出:["o","l","l","e","h"]

示例 2:

輸入:s = ["H","a","n","n","a","h"]
輸出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i]?都是?ASCII?碼表中的可打印字符

代碼:

class Solution {
public:void reverseString(vector<char>& s) {for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {swap(s[i],s[j]);}}
};

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

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

相關文章

人工智能場景下的網絡負載均衡技術

AI技術驅動智能應用井噴&#xff0c;智能算力增速遠超通用算力。IDC預測&#xff0c;未來五年&#xff0c;我國智能算力規模年復合增長率將超50%&#xff0c;開啟數據中心算力新紀元。隨著需求激增&#xff0c;數據中心或智算網絡亟需擴容、增速、減時延&#xff0c;確保網絡穩…

rockylinux 利用nexus 搭建私服yum倉庫

簡單說下為啥弄這個私服&#xff0c;因為自己要學習一些東西&#xff0c;比如新版的k8s等&#xff0c;其中會涉及到一些yum的安裝&#xff0c;為了防止因網絡問題導致yum安裝失敗&#xff0c;和重復下載&#xff0c;所以弄個私服&#xff0c;當然也有為了意外保障的想法&#x…

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解

【實戰JVM】-基礎篇-01-JVM通識-字節碼詳解-類的聲明周期-加載器 1 初識JVM1.1 什么是JVM1.2 JVM的功能1.2.1 即時編譯 1.3 常見JVM 2 字節碼文件詳解2.1 Java虛擬機的組成2.2 字節碼文件的組成2.2.1 正確打開字節碼文件2.2.2 字節碼組成2.2.3 基礎信息2.2.3.1 魔數2.2.3.1 主副…

【C++】右值引用 移動語義

目錄 前言一、右值引用與移動語義1.1 左值引用和右值引用1.2 右值引用使用場景和意義1.3 右值引用引用左值及其一些更深入的使用場景分析1.3.1 完美轉發 二、新的類功能三、可變參數模板 前言 本篇文章我們繼續來聊聊C11新增的一些語法——右值引用&#xff0c;我們在之前就已…

進程間通信的方式中,socket和消息隊列的區別

進程間通信的方式中&#xff0c;socket和消息隊列的區別 進程間通信方式中&#xff0c;socket和消息隊列的主要區別在于通信的方式和跨機通信的能力。 socket是通過網絡傳輸的方式來實現進程間通信&#xff0c;并且可以跨主機&#xff1b;而消息隊列是通過內核提供的緩沖區進…

Flutter 中的 AbsorbPointer 小部件:全面指南

Flutter 中的 AbsorbPointer 小部件&#xff1a;全面指南 在Flutter中&#xff0c;AbsorbPointer是一個特殊的小部件&#xff0c;用于吸收&#xff08;或“吞噬”&#xff09;所有傳遞到其子組件的指針事件&#xff08;如觸摸或鼠標點擊&#xff09;。這在某些情況下非常有用&…

民國漫畫雜志《時代漫畫》第22期.PDF

時代漫畫22.PDF: https://url03.ctfile.com/f/1779803-1248634856-2c7010?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Typescript高級: 深入理解Extract類型

概述 在TypeScript這一逐漸成為前端開發首選的靜態類型檢查語言中&#xff0c;類型系統提供了豐富的工具來幫助開發者編寫更加健壯和可維護的代碼。其中&#xff0c;Extract<T, U>是一個強大的內置實用類型&#xff0c;用于從一個聯合類型T中提取出屬于另一個類型U的那些…

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成!

AIGC 006-textual-inversion使用文本反轉實現個性化文本到圖像生成&#xff01; 文章目錄 0 論文工作1 論文方法2 效果 0 論文工作 這篇論文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一種新穎的技術&#xff0c…

Modal.method() 不顯示頭部的問題

ant-design中的Modal組件有兩種用法&#xff1a; 第一種是用標簽&#xff1a;<a-modal></a-modal> 第二種是用Api&#xff1a;Modal.info、Modal.warning、Modal.confirm...... 一開始項目中這兩種用法是混用的&#xff0c;后面UI改造&#xff0c;需要統一樣式&…

一個程序員的牢獄生涯(37)任務

星期一 任 務 我走回大鐐面前后,把雙手抱著的衣服遞給大鐐,但我并沒有把手里的東西也遞給他。現在的大鐐坐著,我站著,這個時候要給大鐐的話,肯定能被身邊的棍子或六子看到,甚至被所有號子里的人都看到。因為此時,所有人的目光都盯著我手里的衣服,盯著我和大鐐看。 “鐐…

Shell字符串變量

目標 能夠使用字符串的3種方式 掌握Shell字符串拼接 掌握shell字符串截取的常用格式 能夠定義Shell索引數組和關聯數組 能夠使用內置命令alias,echo,read,exit,declare操作 掌握Shell的運算符操作 Shell字符串變量 介紹 字符串&#xff08;String&#xff09;就是一系…

使用LabVIEW時遇到VISA屬性錯誤 -1073807331的解決方案

在LabVIEW或VeriStand中使用VISA屬性時&#xff0c;可能會遇到錯誤 -1073807331。這一錯誤的具體描述如下&#xff1a; 解決方案 導致VISA屬性出現此錯誤的原因主要有以下四種&#xff1a; 屬性不被使用的串行總線支持 示例 A.1&#xff1a;Is Port Connected VISA屬性僅支持由…

React(四)memo、useCallback、useMemo Hook

目錄 (一)memo API 1.先想一個情景 2.用法 (1)props傳入普通數據類型的情況 (2)props傳入對象的情況 (3)props傳入函數的情況 (4)使用自定義比較函數 3.什么時候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo實現組件記憶化 3.useMemo實現函數記憶化 …

如何停止 iPad 和 iPhone 之間共享短信,獨立接收和發送消息

概括 在當今高度互聯的數字世界中&#xff0c;Apple 設備之間的無縫連接性提供了極大的便利&#xff0c;尤其是在消息同步方面。iPhone 和 iPad 用戶通常可以享受到設備間短信的自動同步功能&#xff0c;這意味著無論是在哪個設備上&#xff0c;用戶都可以接收和回復消息。然而…

2024.5.26.python.exercise

# # 導入包 # from pyecharts.charts import Bar, Timeline # from pyecharts.options import LabelOpts, TitleOpts # from pyecharts.globals import ThemeType # # # 從文件中讀取信息 # GDP_file open("1960-2019全球GDP數據.csv", "r", encoding&quo…

A. Maximize?

time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an integer x&#x1d465;. Your task is to find any integer y&#x1d466; (1≤y<x)(1≤&#x1d466;<&#x1d465;) su…

深入理解python列表與字典:數據結構的選擇與性能差異

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、列表與字典&#xff1a;基礎數據結構的對比 二、列表&#xff1a;逐個遍歷的查找方式 …

Ceres求解優化問題

1. 簡介 Ceres Solver是專門用于求解非線性最小二乘問題的C開源庫,研究SLAM方向不過濾波和優化兩個技術路線,因此常用Ceres庫解決實際項目中的優化問題,當然還有g2o同樣可用,但就說明文檔而言,Ceres對新用戶更友好,g2o提供不多的文檔,更多是需要參考其它開源項目使用,所以筆者…

【JAVA】接口

前面我們說了說抽象類相關內容&#xff0c;這篇我們主要聊聊接口相關內容&#xff0c;這部分很重要&#xff0c;大家引起關注。 1. 接口 1.1 接口的概念 接口就是公共的行為規范標準&#xff0c;大家在實現時&#xff0c;只要符合規范標準&#xff0c;就可以通用。在Java中&am…