雙指標的鼻祖題 —— 兩數之和 two
sum
鍊錶上的快慢指標演算法
快速排序 & 歸併排序
• 幾乎所有 two
sum
變種 • partition
• quick select • 分成兩個部分 • 分成三個部分
• 一些你沒聽過的(但是面試會考的)排序演算法
def reverse(s):
left, right = 0, len(s)-1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
2、判斷回文串
def ispalindrome(s):
i, j = 0, len(s)-1
while i < j:
if s[i] != s[j]:
return false
i += 1
j -= 1
return true
同向雙指標的問題,是指兩根指標都從頭出發,朝著同乙個方向前進。
通常解決的問題:
陣列去重問題 remove duplicates in an array
滑動視窗問題 window sum
兩數之差問題 two difference
鍊錶中點問題 middle of linked list
帶環鍊錶問題 linked list cycle
給你乙個陣列,要求去除重複的元素後,將不重複的元素挪到陣列前段,並返回不重複的元素個數。
def deduplication(nums):
n = len(nums)
if n == 0:
return 0
nums.sort()
result = 1
for i in range(1, n):
if nums[i - 1] != nums[i]:
nums[result] = nums[i]
result += 1
return result
同向雙指標模板
nums.sort()
target = abs(target)
j = 1
for i in range(len(nums)):
while j < len(nums) and nums[j]-nums[i] < target:
j += 1
if nums[j]-nums[i] == target:
# 找到答案
給定乙個整數陣列,找到兩個數的差
等於目標值。index1必須小於index2。注意返回的index1和index2不是 0-based。
def twosum7(nums, target):
# write your code here
target = abs(target)
nums2 = [(n, i) for i,n in enumerate(nums)]
nums2.sort(key=lambda x: x[0])
result =
j = 1
for i in range(len(nums2)):
while j < len(nums2) and nums2[j][0]-nums2[i][0] < target:
j += 1
if nums2[j][0]-nums2[i][0] == target:
if i != j:
result = (nums2[i][1]+1, nums2[j][1]+1)
break
if result[0] > result[1]:
return [result[1], result[0]]
return result
def middlenode(self, head):
# write your code here
slow, fast = head, head
while fast and fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
return slow
def hascycle(self, head):
if not head:
return false
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return true
return false
參考: 雙指標演算法
雙指標演算法模板 for int i 0,j 0 i n i 常見問題分類 1 對於乙個序列,用兩個指標維護一段區間 2 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作 例題1 最長連續不重複子序列 給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸...
雙指標演算法
title 雙指標演算法 date 2019 05 26 23 45 09 tags 雙指標演算法 雙指標演算法 主要是兩大類 核心思想 將乙個 o n 2 o n 2 o n2 的演算法 優化成 o n o n o n 的for int i 0 i for int j 0 j for i 0,j ...
雙指標演算法
一般雙指標的模板 雙指標演算法的思考方式 先想出暴力做法,再觀察是否存在單調性。傳統的演算法需列舉兩個指標的組合,兩個for迴圈時間複雜度為o n 2 雙指標演算法會使時間複雜度變為o n 給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸入格式 第一行包含整數n。第...