算法(6)-leetcode-explore-learn-數據結構-數組字符串的雙指針技巧

leetcode-explore-learn-數據結構-數組4-雙指針技巧

  • 1.雙指針技巧--適用情形1
    • 1.1概述
    • 1.2 例題
      • 1.2.1 反轉字符串
      • 1.2.2數組拆分
      • 1.2.3 兩數之和2
  • 2雙指針技巧-適用情形2
    • 2.1概述
    • 2.2例題
      • 2.2.1 移除元素
      • 2.2.2 最大連續1的個數
      • 2.2.3長度最小的子數組

本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/

所有例題的編程語言為python
在一般的數組問題中,我們只采用從第一個元素開始到最后一個元素結束的一個指針來進行迭代。

有些時候需要用兩個指針來迭代數組

1.雙指針技巧–適用情形1

1.1概述

最簡單的例題–反轉數組中的元素(利用連個指針來完成迭代,一個指針從第一個元素開始,另一個指針從末尾開始,持續交換他們所指向的元素,直至倆個指針相遇)
雙指針技巧的經典應用場景之一:從兩端向中間迭代數組,這個技巧經常在排序的數組中使用

1.2 例題

1.2.1 反轉字符串

原地修改給定的輸入字符串數組
數據格式:

輸入:[“h”,“e”,“l”,“l”,“o”]
輸出:[“o”,“l”,“l”,“e”,“h”]

class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""i=0j=len(s)-1while(i<j):s[i],s[j]=s[j],s[i]i+=1j-=1return s

1.2.2數組拆分

給定長度為2n的數組,將這些數字分為n對,例如(a1,b1),(a2,b2),...,(an,bn)(a_1,b_1),(a_2,b_2),...,(a_n,b_n)(a1?,b1?),(a2?,b2?),...,(an?,bn?),使得從1-n的min(ai,bi)min(a_i,b_i)min(ai?,bi?)總和最大。

舉例:a1,a2,a3,a4,a5,a6a_1,a_2,a_3,a_4,a_5,a_6a1?,a2?,a3?,a4?,a5?,a6?升序排列
6個數分三對,能出現在和計算式中的最大數為a5a_5a5?(此時a5和a6a_5和a_6a5?a6?配對),同理剩下的4個數中,依次出現在和式中的為a1,a3a_1,a_3a1?,a3?

解題思路:先對數組排序,然后依次疊加偶數索引元素。

class Solution(object):def arrayPairSum(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)res=0# nums.sort()for i in range(n):if i%2==0:res+=nums[i]return res

1.2.3 兩數之和2

給定一個按升序排列的有序數組,找到兩個數字使得他們相加的和等于目標數
返回兩個數字的下標,index1<index2(索引下標從1開始)
一個輸入只有一對答案,不能重復使用個數組中的元素。

雙指針求解:
if (nums[i]+nums[j]==target): return(i+1,j+1)
if(nums[l]+nums[r]>target):r-=1
if(nums[l]+nums[r]<target):l+=1

class Solution(object):def twoSum(self, numbers, target):""":type numbers: List[int]:type target: int:rtype: List[int]"""l=0r=len(numbers)-1while(l<r):if numbers[l]+numbers[r]==target:return [l+1,r+1]if numbers[l]+numbers[r]<target:l+=1if numbers[l]+numbers[r]>target:r-=1return  -1

2雙指針技巧-適用情形2

2.1概述

適用快慢兩個不同步的指針來解決問題。

經典問題:給定一個數組和一個值,原地刪除該值的所有實例并返回新的長度。空間復雜度要求–原地操作
思路1:快指針用于迭代遍歷數組,慢指針用于指向下一次添加的位 置。

2.2例題

2.2.1 移除元素

題目如概述中

class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""n=len(nums)j=0for i in range(n):if nums[i]!=val:nums[j]=nums[i]j+=1return j

2.2.2 最大連續1的個數

給定一個二進制數組,計算其中最大連續1的個數。
k,m=0,0
快指針遇到1一直加,直至遇到0,統計一下當前1的個數,更新慢指針的位置。
慢指針指向連續1的開頭,快指針指向連續1的結尾。
當快指針遇到0之后,統計一下結果。當遇到下一個1時慢指針才更新。

class Solution(object):def findMaxConsecutiveOnes(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)count=0max_count=0for i in range(n):if nums[i]==1:count+=1if nums[i]==0:max_count=max(max_count,count)count=0return max(max_count,count)               

2.2.3長度最小的子數組

給定一個含有n個正整數的數組和一個正整數s,找出該u數組中滿足其和》=s的長度最小的子數組,并返回其長度。如果不存在符合條件的連續子數組,返回0.

子數組是一個連續的序列
解法1-暴力法

class Solution(object):def minSubArrayLen(self, s, nums):""":type s: int:type nums: List[int]:rtype: int"""n=len(nums)res=n+1for i in range(n):temp=0for j in range(i,n):temp+=nums[j]if temp>=s:res=min(res,j-i+1)break#print (res)if res==n+1:return 0else:return res

解法2-雙指針
以上思路是保持子數組的左端點不動,去尋找右端點。其實一旦知道這個位置開始的子數組不是最優答案,我們就可以移動左端點。使用兩個指針,一個指向數組的開始位置,一個指向數組的最后位置。維護區間內的和>=s,且長度最小。

class Solution(object):def minSubArrayLen(self, s, nums):""":type s: int:type nums: List[int]:rtype: int"""n=len(nums)res=n+1temp_sum=0left=0for i in range(n):temp_sum+=nums[i]while(temp_sum>=s):res=min(res,i-left+1)temp_sum-=nums[left]left+=1#print (res)if res==n+1:return 0else:return res

(2.2.1 和2.2.3例題的雙指針技巧都解的不充分。

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

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

相關文章

POSIX和SYSTEM的消息隊列應該注意的問題

首先看看POSIX的代碼&#xff1a; 1.posix_mq_server.c #include <mqueue.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> #define MQ_FILE "/mq_test" #define BUF_LEN 128 int main() { mqd_t mqd; char b…

算法(7)-leetcode-explore-learn-數據結構-數組-小結

leetcode-explore-learn-數據結構-數組5-小結1.概述2.例題2.1旋轉數組2.2 楊輝三角22.3翻轉字符串里的單詞2.4反轉字符串中的單詞32.5 刪除排序數組中的重復項2.6 移動零本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官…

fcntl函數詳解

功能描述&#xff1a;根據文件描述詞來操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()針對(文件)描述符提供控…

使用nohup讓程序永遠后臺運行

使用nohup讓程序永遠后臺運行 Unix/Linux下一般比如想讓某個程序在后臺運行&#xff0c;很多都是使用 & 在程序結尾來讓程序自動運行。比如我們要運行mysql在后臺&#xff1a; /usr/local/mysql/bin/mysqld_safe --usermysql &但是加入我們很多程序并不象mysqld一樣做…

算法(8)-leetcode-explore-learn-數據結構-鏈表

leetcode-explore-learn-數據結構-鏈表11.概述1.1 鏈表插入操作1.2 鏈表刪除操作2.設計鏈表本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所…

Mysql索引優化實例講解

MYSQL描述&#xff1a;一個文章庫&#xff0c;里面有兩個表&#xff1a;category和article。category里面有10條分類數據。article里面有20萬條。article里面有一個"article_category"字段是與category里的"category_id"字段相對應的。article表里面已經把…

給自己的VIM配置

編輯 .vimrc 文件如下&#xff1a; filetype plugin on "autocmd Filetype cpp,c,java,cs set omnifunccppcomplete#Complete set nu set nocp set nobackup let g:C_AuthorName gaoke let g:C_AuthorRef gaoke let g:C_Email gaoketaomee.…

shell一文入門通

簡單來說“Shell編程就是對一堆Linux命令的邏輯化處理”。 W3Cschool 上的一篇文章是這樣介紹 Shell的 hello world 學習任何一門編程語言第一件事就是輸出HelloWord了&#xff01;下面我會從新建文件到shell代碼編寫來說下Shell 編程如何輸出Hello World。 (1)新建一個文件…

算法(9)--兩個數的最大公約數

兩個數的最大公約數1.輾轉相除法求解兩個數的最大公約數2.更相減損術求解兩個數的最大公約數3.不嚴格理解1.輾轉相除法求解兩個數的最大公約數 輾轉相除法&#xff1a;兩個正整數a和b&#xff08;a>b&#xff09;的最大公約數等于a除以b的余數與b 之間的最大公約數。–如果…

RPC編程

圖 3 說明在客戶機和服務器之間完成 RPC 涉及的步驟。 圖 3. 在客戶機和服務器之間完成 RPC 涉及的步驟服務器 RPC 應用程序初始化期間它會向 RPC 運行時庫注冊接口。需要注冊接口是因為&#xff0c;客戶機在向服務器發出遠程過程調用時&#xff0c;要檢查它是否與服務器兼容。…

synchronized使用和原理全解

synchronized是Java中的關鍵字&#xff0c;是一種同步鎖。它修飾的對象有以下幾種&#xff1a; 修飾一個方法 被修飾的方法稱為同步方法&#xff0c;其作用的范圍是整個方法&#xff0c;作用的對象是調用這個方法的對象&#xff1b; 修飾一個靜態的方法 其作用的范圍是整個…

RPC學習筆記

在查看libc6-dev軟件包提供的工具&#xff08;用 dpkg -L libc6-dev 命令&#xff09;的時候&#xff0c;發現此軟件包提供了一個有用的工具rpcgen命令。通過rpcgen的man手冊看到此工具的作用是把RPC源程序編譯成C語言源程序&#xff0c;從而輕松實現遠程過程調用。下面的例子程…

算法(10)-leetcode-explore-learn-數據結構-鏈表雙指針技巧

leetcode-explore-learn-數據結構-鏈表21.概述2.例題2.1 環形鏈表判斷2.2 環形鏈表22.3 相交鏈表2.4 刪除鏈表的倒數第N個節點3.小結本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn…

一個簡單的游戲服務器框架

最近看到百度空間的一個帖子&#xff0c;不錯&#xff0c;在這里整理下&#xff0c;轉載至我的博客里&#xff0c;開始自己慢慢琢磨寫一個框架。 我先從上層結構說起&#xff0c;一直到實現細節吧&#xff0c;想起什么就寫什么。 第一部分 服務器邏輯 服務器這邊簡單的分為三…

堆和棧的精華大總結

Java內存分配原理 棧、堆、常量池雖同屬Java內存分配時操作的區域&#xff0c;但其適用范圍和功用卻大不相同。 一般Java在內存分配時會涉及到以下區域&#xff1a; ◆寄存器&#xff1a;我們在程序中無法控制 ◆棧&#xff1a;存放基本類型的數據和對象的引用&#xff0c;但…

算法(11)-leetcode-explore-learn-數據結構-鏈表的經典問題

leetcode-explore-learn-數據結構-鏈表31.反轉一個鏈表2.移除鏈表元素3.奇偶鏈表4.回文鏈表5.小結本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-l…

探索式軟件測試

James A.Whittaker [美] 詹姆斯惠特克&#xff08;軟件測試領域絕對的大師&#xff09;著作《Exploratory Software Testing》&#xff0c;中文名《探索式軟件測試》&#xff0c;記得當時被這本書深深吸引啦&#xff08;我不知道有多少做測試的小伙伴看過這本書&#xff09;&am…

Linux線程池的設計

我設計這個線程池的初衷是為了與socket對接的。線程池的實現千變萬化&#xff0c;我得這個并不一定是最好的&#xff0c;但卻是否和我心目中需求模型的。現把部分設計思路和代碼貼出&#xff0c;以期拋磚引玉。個人比較喜歡搞開源&#xff0c;所以大家如果覺得有什么需要改善的…

算法(12)-leetcode-explore-learn-數據結構-雙鏈表的設計

leetcode-explore-learn-數據結構-鏈表4雙鏈表的設計本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所有例題的編程語言為python 雙鏈表的設…

安全方面知識

什么是文件上傳漏洞 文件上傳漏洞是指 由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷&#xff0c;而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件 這里上傳的文件可以是木馬&#xff0c;病毒&#xff0c;惡意腳本或者WebShell等。 這種攻擊方式是…