玩轉演算法面試 (三)LeetCode陣列類問題

2021-09-24 23:43:58 字數 4530 閱讀 5044

陣列中的問題其實最常見。

排序:選擇排序;插入排序;歸併排序;快速排序

查詢:二分查詢法

資料結構:棧;佇列;堆

templateint binarysearch( t arr, int n, t target )

return -1;

}

改變變數的定義,依然可以寫出正確的演算法
templateint binarysearch( t arr, int n, t target )

return -1;

}

給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。

示例 1:

給定 nums = [1,1,1,2,2,3],

函式應返回新長度 length = 5, 並且原陣列的前五個元素被修改為 1, 1, 2, 2, 3 。

你不需要考慮陣列中超出新長度後面的元素。

示例 2:

給定 nums = [0,0,1,1,1,1,2,3,3],

函式應返回新長度 length = 7, 並且原陣列的前五個元素被修改為 0, 0, 1, 1, 2, 3, 3 。

你不需要考慮陣列中超出新長度後面的元素。

class solution 

else

}return k;}};

給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:不能使用**庫中的排序函式來解決這道題。

示例:輸入: [2,0,2,1,1,0]

輸出: [0,0,1,1,2,2]

高階:乙個直觀的解決方案是使用計數排序的兩趟掃瞄演算法。

首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。

你能想出乙個僅使用常數空間的一趟掃瞄演算法嗎?

class solution }}

};

設定三個索引

class solution 

else

swap(nums[--end], nums[i]);}}

};

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2

輸出: 5

示例 2:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4

輸出: 4

說明:你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

建立乙個大小為k的最小堆,時間複雜度klogk。然後將剩餘的n-k個數和堆頂比較,如果大於堆頂則放入堆中,並調整最小堆。時間複雜度o((n-k)logk),總的時間複雜度o(nlogk)。

class solution 

minheap[parent] = temp;

}int findkthlargest(vector& nums, int k)

}return minheap[0];}};

class solution 

nums[i] = pivot;

if(i == k)

return nums[i];

else if(i < k)

return partition(nums, i+1, end, k);

else

return partition(nums, start, i-1, k);

}int findkthlargest(vector& nums, int k)

};

給定 n 個非負整數 a1,a2,...,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。

圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

示例:

輸入: [1,8,6,2,5,4,8,3,7]

輸出: 49

使用雙指標

class solution 

return res;}};

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"

輸出: 3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

class solution ;

int left = -1, right = -1, res = 0;

while(right < (n-1))

else

}res = max(res, right-left);

return res;}};

給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。

字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。

說明:字母異位詞指字母相同,但排列不同的字串。

不考慮答案輸出的順序。

示例 1:

輸入:s: "cbaebabacd" p: "abc"

輸出:[0, 6]

解釋:起始索引等於 0 的子串是 "cba", 它是 "abc" 的字母異位詞。

起始索引等於 6 的子串是 "bac", 它是 "abc" 的字母異位詞。

示例 2:

輸入:s: "abab" p: "ab"

輸出:[0, 1, 2]

解釋:起始索引等於 0 的子串是 "ab", 它是 "ab" 的字母異位詞。

起始索引等於 1 的子串是 "ba", 它是 "ab" 的字母異位詞。

起始索引等於 2 的子串是 "ab", 它是 "ab" 的字母異位詞。

維護乙個長度為字串p的視窗, 每次向右移動乙個單位。同時每次都要比較兩者的內容是否相等,時間複雜度o(26n)

class solution 

int left = 0, right = n;

while(right < m)

if(nump == nums)

index.push_back(left);

return index;}};

雙指標滑動視窗,加上乙個計數器len,時間複雜度o(n)

class solution 

}return index;}};

給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字母的最小子串。

示例:輸入: s = "adobecodebanc", t = "abc"

輸出: "banc"

說明:如果 s 中不存這樣的子串,則返回空字串 ""。

如果 s 中存在這樣的子串,我們保證它是唯一的答案。

此題和上面一題類似,雙指標維護乙個視窗,只是視窗大小不固定,用乙個計數器len來確定視窗是否含有指定的字串。

class solution ;

for(int i =0; i < n; i++)

count[t[i]]++;

int left = 0, right = 0, len = 0, minlength = int_max;

while(right < m)

count[s[left]]++;

if(count[s[left]] > 0)

len--;

left++;}}

return res;}};

玩轉演算法面試(九) 貪心演算法

假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i 都有乙個胃口值 gi 這是能讓孩子們滿足胃口的餅乾的最小尺寸 並且每塊餅乾 j 都有乙個尺寸 sj 如果 sj gi 我們可以將這個餅乾 j 分配給孩子 i 這個孩子會得到滿足。你的目標是盡可能滿足...

python 玩轉leetcode演算法題 加1

最高位數字存放在陣列的首位,陣列中每個元素只儲存單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。輸入 1 2,3 輸出 1 2,4 解釋 輸入陣列表示數字 123 輸入 4 3,2 1 輸出 4 3,2 2 解釋 輸入陣列表示數字 4321。主要 class solution def ...

bobo老師玩轉演算法面試,如何準備技術面試?

看了慕課網bobo老師的玩轉演算法面試課程,做了一些筆記。演算法面試是什麼?演算法面試需要有乙個合理的思考路徑 演算法只是技術的一部分。不代表能夠 正確 回答每乙個演算法問題,但是合理的思考方向其實更重要,也是正確完成演算法面試問題的前提 演算法面試優秀不意味著技術面試優秀 技術面試優秀不意味著能夠...