陣列中的問題其實最常見。
排序:選擇排序;插入排序;歸併排序;快速排序
查詢:二分查詢法
資料結構:棧;佇列;堆
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老師的玩轉演算法面試課程,做了一些筆記。演算法面試是什麼?演算法面試需要有乙個合理的思考路徑 演算法只是技術的一部分。不代表能夠 正確 回答每乙個演算法問題,但是合理的思考方向其實更重要,也是正確完成演算法面試問題的前提 演算法面試優秀不意味著技術面試優秀 技術面試優秀不意味著能夠...