指標的妙用

2021-10-19 12:06:56 字數 2308 閱讀 4719

指標或者叫做索引、下標,靈活使用可以完成比較巧妙地效果

快慢指標,表示兩個指標,移動的速度不同,通常一般快指標速度是慢指標速度的兩倍,通過兩個指標相對位置的關係可以解決一些問題,例如:查詢鍊錶環起點問題

演算法步驟:

快慢指標都從鍊錶起點開始移動(兩個指標速度插一倍),當兩個指標再次相遇時停止本次移動

listnode fast, slow;

fast = slow = head;

while

(fast != null && fast.next != null)

假設慢指標移動k步,那麼快指標移動了2k步,兩者在a點相遇,則環的大小為k,如下:

假設環起點與a點距離m步,那麼鍊錶起點到環起點為k -m 步,恰巧環的大小為k,若從m開始移動,那麼也是k-m步會再次到達環的起點,因此兩個指標乙個從鍊錶起點開始移動,另乙個從相遇點移動,兩者同速,那麼會在同一時間到達環起點

典型應用就是二分查詢演算法

int

search

(int

nums ,

int target)

}

1、我們在字串s中使用雙指標中的左右指標技巧,初始化left = right = 0,把索引左閉右開區間[left, right)稱為乙個「視窗」。

2、我們先不斷地增加right指標擴大視窗[left, right),直到視窗中的字串符合要求(包含了t中的所有字元)。

3、此時,我們停止增加right,轉而不斷增加left指標縮小視窗[left, right),直到視窗中的字串不再符合要求(不包含t中的所有字元了)。同時,每次增加left,我們都要更新一輪結果。

4、重複第 2 和第 3 步,直到right到達字串s的盡頭。

這個思路其實也不難,第 2 步相當於在尋找乙個「可行解」,然後第 3 步在優化這個「可行解」,最終找到最優解,也就是最短的覆蓋子串。左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動,這就是「滑動視窗」這個名字的來歷。

下面舉例

理解一下,needs和window相當於計數器,分別記錄t中字元出現次數和「視窗」中的相應字元的出現次數。

初始狀態:

將視窗右指標向右移動,即擴大視窗,知道t中包含所有

雖然t包含了查詢串的所有字元,但並不是最小值,而且字元b重複了,此時可以縮小視窗,即左指標右移動

之後重複上述過程,先移動right,再移動left…… 直到right指標到達字串s的末端,演算法結束。

string minwindow

(string s, string t)

// 判斷左側視窗是否要收縮

while

(valid == need.

size()

)// d 是將移出視窗的字元

char d = s[left]

;// 左移視窗

left++

;// 進行視窗內資料的一系列更新

if(need.

count

(d))}}

// 返回最小覆蓋子串

return len == int_max ?

"": s.

substr

(start, len)

;}

this指標的妙用

每個物件都可以通過this指標訪問自己的位址 物件的this指標不是物件自身的一部分,也就是說,this指標占用的記憶體大小不會反映在對物件進行sizeof運算子得到的結果中 this指標作為乙個隱式的引數傳遞給物件的每個非static成員函式 物件隱式地使用this指標或者顯式地使用this指標,...

函式指標的妙用

今天上www.armfans.net 上瀏覽帖子的時候,看到乙個很好玩且非常有學習意義的帖子,將的是c中函式指標的妙用,現將內容轉錄如下 一小段精彩的 c語言,1和2實現相同的功能,歡迎大夥跟帖呵 特別感謝trio老師 1 void theuboot void theuboot void void ...

函式指標的妙用

假設程式裡面定義了100函式,函式名為fun1,fun2,fun3,fun4.fun100.想在程式執行時候,給定乙個數比如10,如何能自動的呼叫fun10,輸入20,自動呼叫fun20呢?用if else 或者switch case都能實現。但有沒有更好的辦法呢?定義乙個巨集 define fun...