成功人士從不刷Leetcode(3)

1. Two sum(leetcode.com/problems/t)

要求:求一個數組的數,返回數組的兩個元素的index,使這兩個元素之和等於目標值。

思路:使用hash map存儲第N個元素AN,以值為key,以index為value。讀到第N+1個元素A(N+1)時,先在map中尋找key為target-A(N+1),如果沒有,則繼續把第N+1個元素存儲進map,否則返回N+1和查找到的map中元素的value(即對應元素的index)。

提示:用unordered_map代替map。

class Solution {npublic:n vector<int> twoSum(vector<int>& nums, int target) {n unordered_map<int,int> h;n vector<int> ret;n for (int i=0;i<nums.size();i++){n if (h.find(target - nums[i]) == h.end() ) h[nums[i]] = i;n else {n ret.push_back(h[target - nums[i]]);n ret.push_back(i);n }n }n return ret;n }n};n

2. Add Two Numbers (leetcode.com/problems/a)

要求:將兩個LinkedList的各個元素相加,組成一個新的LinkedList。

提示:走遍兩個LinkedList,把value相加即可。注意兩點:1. 當兩個LinkedList長度不一樣時,應該考慮在末尾再補上長出的List;2. 注意設置進位位,每一次添加新的Node時都應該考慮加前一個進位位和新的進位位,並且注意處理在所有List加完之後最後進位位是否還有剩餘,如果還有,則再添加一個ListNode(1)(例如999999 + 1 = 1000000)

/**n * Definition for singly-linked list.n * struct ListNode {n * int val;n * ListNode *next;n * ListNode(int x) : val(x), next(NULL) {}n * };n */nclass Solution {npublic:n ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {n ListNode* newhead = new ListNode(0);n ListNode* cur = newhead;n int mark = 0;n while (l1 && l2) {n cur->next = new ListNode( (l1->val + l2->val + mark) % 10 );n mark = ( (l1->val + l2->val + mark) >= 10)?1:0;n l1 = l1->next;n l2 = l2->next;n cur = cur->next;n }n n while (l1) {n cur->next = new ListNode ((l1->val + mark) % 10);n mark = (l1->val + mark >= 10)?1:0;n cur = cur->next;n l1 = l1->next;n }n n while (l2) {n cur->next = new ListNode( (l2->val + mark) % 10 );n mark = (l2->val + mark >= 10)?1:0;n cur = cur->next;n l2 = l2->next;n }n n if (mark) cur->next = new ListNode(1);n return newhead->next;n }nn};n

104. Maximum Depth of Binary Tree(leetcode.com/problems/m)

要求:求一個Binary Tree的最大的深度。

提示:recursive解法。

class Solution {npublic:n int maxDepth(TreeNode* root) {n if (!root) return 0;n else return max(maxDepth(root->left), maxDepth(root->right)) + 1;n }n};n

155. Min Stack (leetcode.com/problems/m)

要求:實現一個stack,使其不僅有stack的方法,還有getmin()的方法,以O(1)的時間讀取stack所有元素的最小值。

提示:另設一個st_min的stack,使得該stack的頂端值,為當前stack的最小值。如果新push進來的元素小於st_min的top,則把該元素也push到st_min中。當從stack中pop一個元素時,如果該元素剛好等於st_min的top,則同樣pop出st_min的元素。

class MinStack {npublic:n /** initialize your data structure here. */n stack<int> st;n stack<int> st_min;n MinStack() {n }n void push(int x) {n st.push(x);n if (st_min.size() == 0 || st_min.top() >= x) st_min.push(x);n }n void pop() {n if (st_min.top() == st.top()) st_min.pop();n st.pop();n }n int top() {n return st.top();n }n int getMin() {n return st_min.top();n }nnn};n

7. Reverse Integer(leetcode.com/problems/r)

要求:將一個整數的各位數字顛倒過來。

提示:要判斷顛倒過來的數字是否在INT_MIN~INT_MAX範圍內,否則返回0。

class Solution {npublic:n int reverse(int x) {n int neg_mark = x>0?1:0;n long y = 0;n x = abs(x);n while (x) {n y = y * 10 + x % 10;n x /= 10;n }n if (y > INT_MAX || y < INT_MIN) return 0;n return neg_mark? y:(y*-1);n }n};n

206. Reverse Linked List(leetcode.com/problems/r)

提示:使用Recursive method,當head->next之後的所有List都反轉後,head->next指向的是該list的最後一個,而之前函數返回的是該List的第一個,因此只要把head放在head->next最後,並把返回的head_next給返回了即可。

class Solution {npublic:n ListNode* reverseList(ListNode* head) {n if (!head || !head->next) return head;n ListNode* head_next = reverseList(head->next);n head->next->next = head;n head->next = NULL;n return head_next;n }n};n

再給一個Iterative的寫法。

class Solution {npublic:n ListNode* reverseList(ListNode* head) {n ListNode* newhead = new ListNode(0);n if (!head) return NULL;n ListNode* temp = head->next;n if (!temp) return head;n while (temp) {n temp = head->next;n head->next = newhead->next;n newhead->next = head;n head = temp;n }n return newhead->next;n }n};n

141. Linked List Cycle (leetcode.com/problems/l)

提示:使用快慢指針,注意判斷快指針next的有效性。

class Solution {npublic:n bool hasCycle(ListNode *head) {n ListNode* f; //fastn ListNode* s; //slown if (!head || !head->next) return false;n f = s = head;n while (f) {n if (f->next) f = f->next->next;n else return false;n s = s->next;n if (f==s) return true;n }n return false;n }n};n

我發現每天晚上碼的「成功人士從不刷Leetcode」系列已經成為知乎書館最受歡迎的連載內容,臨睡前寫一點,寫起來不費勁,還有好多人愛看。如果您對某道題目有更好的解法,或者有錯誤指出,歡迎直接投稿到本專欄。有人說我第一期就那麼敷衍,後來為什麼越來越敷衍了呢,於是從明天起只講medium和hard的題目。

另外英國成功脫離歐洲,曾老師將於近期在本專欄直播裸奔,敬請關注。


推薦閱讀:

什麼是演算法和數據結構。
[數據結構]走近Zkw線段樹(一)
數據結構與演算法 - 圖論

TAG:算法 | 算法与数据结构 |