快慢指標
雙指標:兩個指標指向不同元素,從而協同完成任務,主要用於遍歷元素。
對撞指標,快慢指標,滑動視窗
對撞指標是指在陣列中,將指向最左側的索引定義為左指標,最右側的定義為右指標,然後從兩頭向中間進行陣列遍歷。
leetcode 167 兩數之和 ii - 輸入有序陣列
給定乙個已按照 公升序排列 的整數陣列 numbers ,請你從陣列中找出兩個數滿足相加之和等於目標數 target 。
函式應該以長度為 2 的整數陣列的形式返回這兩個數的下標值。numbers 的下標 從 1 開始計數 ,所以答案陣列應當滿足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例 1:
輸入:numbers =[2
,7,11
,15], target =
9輸出:[1,
2]解釋:2 與 7 之和等於目標數 9 。因此 index1 =
使用對撞指標,初始化乙個指標指向最左,乙個指標指向最右,相向遍歷,如果兩者之和小於給定值,則左指標向右移一位,否則右指標向左移一位
步驟:初始化雙指標
尋找目標值
class
solution
: def twosum
(self, numbers: list[int]
, target: int)
-> list[int]
: k,i =
len(numbers)-1
,0while i < k:
if numbers[i]
+numbers[k]
> target:
k-=1 elif numbers[i]
+numbers[k]
< target:
i+=1else
:break
return
[i+1
,k+1
]
快慢指標:兩個指標從同一側開始遍歷陣列,將這兩個指標分別定義為快指標和慢指標,兩個指標以不同的策略移動,直到兩個指標的值相等(或其他特殊條件)為止,如快指標每次增長兩個,慢指標每次增長乙個。
leetcode 142 環形鍊錶 ii
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。
為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。
說明:不允許修改給定的鍊錶。
高階:你是否可以使用 o(1) 空間解決此題?
示例1
輸入:head =[3
,2,0
,-4]
, pos =
1輸出:返回索引為 1 的鍊錶節點
解釋:鍊錶中有乙個環,其尾部連線到第二個節點。
初始化兩個指標,快指標前進兩步,慢指標前進一步,如果存在環路則快指標可以無限迴圈下去,並與慢指標在某一時刻相遇。否則,快指標可以走到盡頭。當第一次相遇,將快指標重新回到表頭,,並讓其每次前進一步,則第二次相遇即為環路開始點
步驟:初始化雙指標
尋找第一次相遇
重新初始化
尋找第二次相遇
# 定義鍊錶
class
listnode
: def __init__
(self, x)
: self.val = x
self.next = none
#快慢指標
class
solution
: def detectcycle
(self, head: listnode)
-> listnode:
fast,slow = head,head #初始化快慢指標
while true:
ifnot
(fast and fast.next)
: #判斷快指標是否能無線迴圈
return
if fast == slow: #判斷相遇
break
fast,slow = fast.next.next,slow.next #定義前進規則
fast = head #重新初始化
while fast != slow: #第二次相遇判斷,查詢起始點
fast,slow = fast.next,slow.next #定義規則
return fast
注:
python中煉表定義與呼叫
1.定義鍊錶
2.定義鍊錶操作函式
3.呼叫
#定義鍊錶(單鏈表)
class
listnode
:def
__init__
(self)
:#root節點預設none
self.val =
none
self.
next
=none
#定義鍊錶操作函式
class
listnode_handle
:def
__init__
(self)
: self.cur_node =
none
defadd
(self, data)
:#頭插法插入新元素
node = listnone(
) node.val = data
node.
next
= self.cur_node
self.cur_node = node
return node
defprint_listnode
(self,node)
:while node:
print
(node)
node = node.
next
#鍊錶初始化呼叫
listnode_operate = listnode_handle(
)l1 = listnode(
)l1_list =[1
,2,3
]for i in l1_list:
l1 = listnode_operate.add(i)
listnode_operate.print_listnode(l1)
#輸出結果
#3->2->1
EM演算法學習 三
在前兩篇文章中,我們已經大致的講述了關於em演算法的一些基本理論和一些基本的性質,以及針對em演算法的缺點進行的優化改進的新型em演算法,研究之後大致就能夠進行初步的了解.現在在這最後一篇文章,我想對em演算法的應用進行一些描述 em演算法在多元正態分佈缺失的資料下一般都是有較為廣泛的應用,所以在這...
Apriori演算法學習筆記 三
apriori演算法的python實現from future import print function import pandas as pd 頻繁規則的產生 用於實現l 到c k的連線 deffind freq set x,ms x list map lambda i sorted i.spli...
演算法學習系列(三) 陣列
陣列挑了自己不太熟悉的詳細寫一下 在一些場景下,三角型陣列可以用來代替矩形陣列,以達到節省空間的目的,即對角線某一側的資料可以用預設值來代替 矩形陣列較小的情況下,節省空間的效果不是很明顯,但在10000 10000的陣列中,三角型矩陣可以節約大約5000萬個條目!如何建立乙個三角形陣列 把陣列的值...