演算法學習(三)

2021-10-19 09:06:53 字數 3534 閱讀 2707

快慢指標

雙指標:兩個指標指向不同元素,從而協同完成任務,主要用於遍歷元素。

對撞指標,快慢指標,滑動視窗

對撞指標是指在陣列中,將指向最左側的索引定義為左指標,最右側的定義為右指標,然後從兩頭向中間進行陣列遍歷。

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萬個條目!如何建立乙個三角形陣列 把陣列的值...