雙指針問題

題目詳細說明請自行到題庫 - 力扣 (LeetCode)搜尋題號

1. 兩數(shù)和

利用數(shù)組的有序,使用兩個指針,一個為l,指向數(shù)組開頭,一個為r,指向數(shù)組結尾;

和大于target時右邊指針左移一個,獲得比當前小的下一個和;

和小于target時左邊指針右移一個,獲得比當前大的下一個和;

循環(huán)條件為 l < r ,循環(huán)結束時就把所有的和都遍歷了一遍, 時間復雜度為O(n);

167. Two Sum II - Input array is sorted

給定一個已按照升序排列的有序數(shù)組停巷,找到兩個數(shù)使得它們相加之和等于目標數(shù)喷好。

函數(shù)應該返回這兩個下標值?index1 和 index2,其中 index1?必須小于?index2

class Solution:

? ? def twoSum(self, numbers, target):

? ? ? ? """

? ? ? ? :type numbers: List[int]

? ? ? ? :type target: int

? ? ? ? :rtype: List[int]

? ? ? ? """

? ? ? ? if len(numbers) < 2:

? ? ? ? ? ? return None

? ? ? ? l = 0

? ? ? ? r = len(numbers) - 1

? ? ? ? while l < r:

? ? ? ? ? ? s = numbers[l] + numbers[r]

? ? ? ? ? ? if s == target:

? ? ? ? ? ? ? ? #這道題下標從1開始的

? ? ? ? ? ? ? ? return [l + 1, r + 1]

? ? ? ? ? ? elif s < target:

? ? ? ? ? ? ? ? l += 1

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? r -= 1

? ? ? ? return None

2. 擴展, 三數(shù)和

怎么把三數(shù)和轉(zhuǎn)化為兩數(shù)和呢?

我們可以遍歷一次數(shù)組取每一個 nums[i] ,使三數(shù)和等于target相當于

在 nums[ i + 1 : ] 中找兩個下標 l , r 使 nums[l] + nums[r] == target - nums[i]

這樣就轉(zhuǎn)化為兩數(shù)和問題, 時間復雜度為 O(n2) , 注意去除重復答案

15. 3Sum

給定一個包含?n?個整數(shù)的數(shù)組nums革答,判斷nums中是否存在三個元素?a,b曙强,c 残拐,使得a + b + c =?0 ?找出所有滿足條件且不重復的三元組碟嘴。

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

class Solution:

? ? def threeSum(self, nums):

? ? ? ? """

? ? ? ? :type nums: List[int]

? ? ? ? :rtype: List[List[int]]

? ? ? ? """

? ? ? ? #先排序

? ? ? ? nums.sort()

? ? ? ? res = []

? ? ? ? #current標記用于去重

? ? ? ? current = '-1'

? ? ? ? for i, value in enumerate(nums):

? ? ? ? ? ? if current == value:

? ? ? ? ? ? ? ? continue

? ? ? ? ? ? current = value

? ? ? ? ? ? l = i + 1

? ? ? ? ? ? r = len(nums) - 1

? ? ? ? ? ? while l < r:

? ? ? ? ? ? ? ? s = nums[i] + nums[l] + nums[r]

? ? ? ? ? ? ? ? if s == 0:

? ? ? ? ? ? ? ? ? ? res.append([nums[i],nums[l],nums[r]])

? ? ? ? ? ? ? ? ? ? l += 1

? ? ? ? ? ? ? ? ? ? r -= 1

? ? ? ? ? ? ? ? ? ? #去掉重復l

? ? ? ? ? ? ? ? ? ? while l < r and nums[l] == nums[l - 1]:

? ? ? ? ? ? ? ? ? ? ? ? l += 1

? ? ? ? ? ? ? ? ? ? #去掉重復r

? ? ? ? ? ? ? ? ? ? while r > l and nums[r] == nums[r + 1]:

? ? ? ? ? ? ? ? ? ? ? ? r -= 1

? ? ? ? ? ? ? ? elif s < 0:

? ? ? ? ? ? ? ? ? ? l += 1

? ? ? ? ? ? ? ? else:

? ? ? ? ? ? ? ? ? ? r -= 1

? ? ? ? return res

還有一道4數(shù)和的題目, 思路是一樣的, 再加一層循環(huán), 時間復雜度為 O(n3)

3. 盛水最多容器

用雙指針做,取2個指針,最左 l 和最右 r , 計算兩塊板裝的面積

當 l 的板比 r 的高時 , r -= 1

當 r 的板比 l 的高時,? l += 1

雙指針遍歷相當于求每個寬度下的最大面積, 從中取一個最大值, 時間復雜度為O(n)

11. Container With Most Water

給定?n?個非負整數(shù)?a1,a2娜扇,...错沃,an栅组,每個數(shù)代表坐標中的一個點?(i,ai) 。在坐標內(nèi)畫?n?條垂直線枢析,垂直線?i的兩個端點分別為?(i,ai) 和 (i, 0)玉掸。找出其中的兩條線,使得它們與x軸共同構成的容器可以容納最多的水醒叁。

說明:你不能傾斜容器司浪,且n的值至少為 2。

class Solution:

? ? def maxArea(self, height):

? ? ? ? """

? ? ? ? :type height: List[int]

? ? ? ? :rtype: int

? ? ? ? """

? ? ? ? res = 0

? ? ? ? l, r = 0, len(height) - 1

? ? ? ? while l < r:

? ? ? ? ? ? #求面積, 等于寬度乘以 l , r 中高度比較小的那個值

? ? ? ? ? ? res = max(res, (r - l) * min(height[l],height[r]))

? ? ? ? ? ? if height[l] > height[r]:

? ? ? ? ? ? ? ? r -= 1

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? l += 1

? ? ? ? return res

4. 搜尋二維矩陣

使用兩層循環(huán)搜索時間復雜度為O(n2) , 而且沒用到題目給的有序的條件

我們可以假設右上角的值 matrix[x][y] 為初始值, 其中 x = 0 , y = n

當matrix[x][y]? < target時,? 說明 matrix[x] 這一行上的值都比 target 小, x += 1

當matrix[x][y] > target時, 說明matrix在y這一列上的值都比target 大, y -= 1

找到target時返回True, 超出矩陣后返回False? 時間復雜度為 O(m + n)

240. Search a 2D Matrix II

編寫一個高效的算法來搜索m?x?n矩陣 matrix 中的一個目標值 target把沼。該矩陣具有以下特性:

每行的元素從左到右升序排列啊易。

每列的元素從上到下升序排列。

class Solution:

? ? def searchMatrix(self, matrix, target):

? ? ? ? """

? ? ? ? :type matrix: List[List[int]]

? ? ? ? :type target: int

? ? ? ? :rtype: bool

? ? ? ? """

? ? ? ? #判斷矩陣有沒有值

? ? ? ? x = len(matrix)

? ? ? ? if x == 0:

? ? ? ? ? ? return False

? ? ? ? y = len(matrix[0])

? ? ? ? if y == 0:

? ? ? ? ? ? return False

? ? ? ? #y取最后一列的下標

? ? ? ? y -= 1

? ? ? ? i = 0

? ? ? ? while i < x and y >= 0:

? ? ? ? ? ? if matrix[i][y] < target:

? ? ? ? ? ? ? ? i += 1

? ? ? ? ? ? elif matrix[i][y] > target:

? ? ? ? ? ? ? ? y -= 1

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? return True

? ? ? ? return False

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饮睬,一起剝皮案震驚了整個濱河市租谈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捆愁,老刑警劉巖垦垂,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牙瓢,居然都是意外死亡劫拗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門矾克,熙熙樓的掌柜王于貴愁眉苦臉地迎上來页慷,“玉大人,你說我怎么就攤上這事胁附【品保” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵控妻,是天一觀的道長州袒。 經(jīng)常有香客問我,道長弓候,這世上最難降的妖魔是什么郎哭? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮菇存,結果婚禮上夸研,老公的妹妹穿的比我還像新娘。我一直安慰自己依鸥,他們只是感情好亥至,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般姐扮。 火紅的嫁衣襯著肌膚如雪絮供。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天茶敏,我揣著相機與錄音杯缺,去河邊找鬼。 笑死睡榆,一個胖子當著我的面吹牛萍肆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胀屿,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼塘揣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宿崭?” 一聲冷哼從身側(cè)響起亲铡,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葡兑,沒想到半個月后奖蔓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讹堤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年吆鹤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洲守。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡疑务,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梗醇,到底是詐尸還是另有隱情知允,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布叙谨,位于F島的核電站温鸽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏手负。R本人自食惡果不足惜涤垫,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虫溜。 院中可真熱鬧雹姊,春花似錦、人聲如沸衡楞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘾境。三九已至歧杏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迷守,已是汗流浹背犬绒。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兑凿,地道東北人凯力。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像礼华,于是被迫代替她去往敵國和親咐鹤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容