指標或者叫做索引、下標,靈活使用可以完成比較巧妙地效果
快慢指標,表示兩個指標,移動的速度不同,通常一般快指標速度是慢指標速度的兩倍,通過兩個指標相對位置的關係可以解決一些問題,例如:查詢鍊錶環起點問題
演算法步驟:
快慢指標都從鍊錶起點開始移動(兩個指標速度插一倍),當兩個指標再次相遇時停止本次移動
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...