資料結構與演算法 雙指標思想 首尾雙向遍歷

2022-07-24 11:42:10 字數 1833 閱讀 1137

leetcode:兩數之和 ii - 輸入有序陣列

題目描述:

給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。

函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。

示例:

輸入: numbers = [2, 7, 11, 15], target = 9

輸出: [1,2]

解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。

思想:

使用雙指標,乙個指標指向值較小的元素,乙個指標指向值較大的元素。指向較小元素的指標從頭向尾遍歷,指向較大元素的指標從尾向頭遍歷。

**:

class solution else

}return res;

}}

leetcode:兩數之和

題目描述:

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例:給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思想:使用map鍵值對列表;迴圈遍歷陣列,每訪問乙個元素,將其值和下標存入map中;每次迴圈訪問時,查詢map中是否已存在與它和為target的key,若存在則輸出此時的 i 和該key對應的value。

**:

class solution 

return false;

}}

leetcode:反轉字串中的母音字母

題目描述:

編寫乙個函式,以字串作為輸入,反轉該字串中的母音字母。

示例:

輸入: "leetcode"

輸出: "leotcede"

思想:

首尾雙向遍歷沒有問題;注意以下兩點:

**:

class solution 

if(!set.contains(str[j]))

char temp = str[i];

str[i] = str[j];

str[j] = temp;

++i;--j;

}return new string(str);

}}

leetcode:驗證回文字串2

題目描述:

給定乙個非空字串 s,最多刪除乙個字元。判斷是否能成為回文字串。

示例:

輸入: "abca"

輸出: true

解釋: 你可以刪除c字元。

思想:

自己想的第一種思路:首尾雙向遍歷,碰到不相等的,向內移位,記錄移位次數,超過兩次返回false。這樣有乙個問題,無法判斷是移動low還是移high。

正確做法:首尾雙向遍歷,碰到不相等的,判斷內層是否是回文串(單獨寫乙個函式),因為只允許刪除乙個字元,最多呼叫兩次函式,時間複雜度不會太高。

**:

class solution 

low++;

high--;

}return true;

}private boolean isvalid(string s,int low,int high)

low++;

high--;

}return true;

}}

資料結構演算法 雙指標

演算法核心思想 雙指標多用於遍歷陣列,可以同時遍歷乙個陣列或分別遍歷不同的陣列。常見的設計思想如下 對於排序後的陣列,雙指標分別指向陣列的頭尾,遍歷方向相反,用於搜尋。雙指標指向兩個陣列,分別遍歷 快慢指標 滑動視窗 兩數之和 167.two sum ii input array is sorted...

資料結構與演算法 雙鏈表

刪除結點 遍歷元素 雙鏈表的高階操作 與單鏈表一樣,我還是建議用過掌握基礎操作來拼湊成大的操作。單鏈表指標域只有乙個next指標,指向下乙個結點,這就導致了它只能從前往後訪問。為了彌補這一缺陷,我們可以往指標域裡再加入乙個指標prior,用於指向前面的結點,這樣就可以實現雙向訪問了 與單鏈表相似,建...

資料結構與演算法 雙端佇列

雙端佇列和普通佇列不同的地方是既可以隊首和隊尾進行插入,同時也就可以從隊首和隊尾進行remove刪除 同時不遵循先進先出或者先進後出的規則,這需要通過具體的演算法實現來確定,這個資料結構的實現過程如下 class deque def init self self.items defisempty s...