1.binary-tree-zigzag-level-order-traversal(二叉树的锯齿遍历)
地址:http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/
分析:设置个flag,根据flag来决定是否reverse每行的元素
代码:

1 class Solution { 2 /** 3 * @param root: The root of binary tree. 4 * @return: A list of lists of integer include 5 * the zigzag level order traversal of its nodes' values 6 */ 7 public: 8 vector<vector<int>> zigzagLevelOrder(TreeNode *root) { 9 // write your code here 10 int flag = 0; 11 vector<vector<int>> ans; 12 vector<int> add; 13 if (root == NULL) return ans; 14 queue<TreeNode*> qu, tmp; 15 qu.push(root); 16 while (!qu.empty()) 17 { 18 TreeNode *tn = qu.front(); 19 add.push_back(tn->val); 20 qu.pop(); 21 if (tn->left) tmp.push(tn->left); 22 if (tn->right) tmp.push(tn->right); 23 if (qu.empty()) 24 { 25 if (flag) reverse(add.begin(), add.end()); 26 ans.push_back(add); add.clear(); 27 flag = !flag; 28 } 29 if (qu.empty() && (!tmp.empty())) 30 { 31 qu = tmp; 32 while (!tmp.empty()) tmp.pop(); 33 } 34 } 35 return ans; 36 } 37 };
2.combination-sum-ii(数字合并)
地址:http://www.lintcode.com/zh-cn/problem/combination-sum-ii/#
分析:dfs+双指针,注意剪枝
代码:

1 class Solution { 2 public: 3 /** 4 * @param num: Given the candidate numbers 5 * @param target: Given the target number 6 * @return: All the combinations that sum to target 7 */ 8 void work(int sum, int target, int cnt, int idx, vector<vector<int>> &ans, vector<int>& add, vector<int>& num) 9 { 10 if (sum > target) return ; 11 if (cnt < 2) return ; 12 if (cnt == 2) 13 { 14 int i = idx, j = num.size()-1; 15 while (i < j) 16 { 17 if (num[i]+num[j]+sum == target) 18 { 19 add.push_back(num[i]); add.push_back(num[j]); 20 ans.push_back(add); 21 add.pop_back(); add.pop_back(); 22 i++; 23 } 24 else if (num[i]+num[j]+sum > target) j--; 25 else i++; 26 } 27 return ; 28 } 29 for (int i = idx; i < num.size(); ++i) 30 { 31 if (sum+num[i] > target) break; 32 add.push_back(num[i]); 33 work(sum+num[i], target, cnt-1, i+1, ans, add, num); 34 add.pop_back(); 35 } 36 } 37 vector<vector<int> > combinationSum2(vector<int> &num, int target) { 38 // write your code here 39 sort(num.begin(), num.end()); 40 vector<vector<int>> ans; 41 vector<int> add; 42 for (int i = 0; i < num.size(); ++i) 43 { 44 if (num[i] == target) 45 { 46 add.push_back(target); 47 ans.push_back(add); 48 add.clear(); 49 } 50 } 51 for (int i = 2; i <= num.size(); ++i) 52 work(0, target, i, 0, ans, add, num); 53 if (ans.size() == 0) return ans; 54 vector<vector<int>> ret; 55 sort(ans.begin(), ans.end()); 56 ret.push_back(ans[0]); 57 for (int i = 1; i < ans.size(); ++i) 58 if (ans[i] != ret.back()) ret.push_back(ans[i]); 59 return ret; 60 } 61 };
3.最大值查询
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5443
分析:直接用线段树搞,简单题目。写的好丑==好久没写了。
代码:

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <set> 7 #include <utility> 8 #include <map> 9 #include <cstdlib> 10 #include <queue> 11 #include <vector> 12 #include <numeric> 13 #include <list> 14 #include <bitset> 15 #include <exception> 16 #include <istream> 17 #include <ostream> 18 #include <stdexcept> 19 #include <functional> 20 #include <typeinfo> 21 22 #define LL long long int 23 using namespace std; 24 25 const int maxn = 1010; 26 typedef struct node 27 { 28 int left, right, val; 29 }node; 30 31 node stree[maxn<<2]; 32 int a[maxn]; 33 int t, n, q; 34 35 void build(int root, int l, int r) 36 { 37 if (l == r) stree[root].val = a[l], stree[root].left = l, stree[root].right = r; 38 else 39 { 40 build(2*root, l, (l+r)/2); 41 build(2*root+1, (l+r)/2+1, r); 42 stree[root].left = l, stree[root].right = r; 43 stree[root].val = max(stree[2*root].val, stree[2*root+1].val); 44 } 45 } 46 47 int query(int root, int l, int r) 48 { 49 if (l > stree[root].right || r < stree[root].left) return INT_MIN; 50 if (stree[root].left >= l && stree[root].right <= r) return stree[root].val; 51 return max(query(root*2, l, r), query(root*2+1, l, r)); 52 } 53 54 int main() 55 { 56 int l, r; 57 scanf("%d", &t); 58 while (t--) 59 { 60 scanf("%d", &n); 61 for (int i = 0; i < n; ++i) scanf("%d", &a[i]); 62 build(1, 0, n-1); 63 scanf("%d", &q); 64 for (int i = 0; i < q; ++i) 65 { 66 scanf("%d%d", &l, &r); 67 printf("%d ", query(1, l-1, r-1)); 68 } 69 } 70 71 return 0; 72 }
4.最长公共子序列
地址:http://www.lintcode.com/zh-cn/problem/longest-common-subsequence/
分析:DP
代码:

1 class Solution { 2 public: 3 /** 4 * @param A, B: Two strings. 5 * @return: The length of longest common subsequence of A and B. 6 */ 7 int longestCommonSubsequence(string A, string B) { 8 // write your code here 9 int dp[1010][1010]; 10 memset(dp, 0, sizeof(dp)); 11 for (int i = 0; i < A.length(); ++i) 12 { 13 for (int j = 0; j < B.length(); ++j) 14 { 15 if (A[i] == B[j]) 16 { 17 if (i == 0 || j == 0) dp[i][j] = 1; 18 else dp[i][j] = max(dp[i-1][j-1]+1, max(dp[i][j-1], dp[i-1][j])); 19 } 20 else 21 { 22 if (i == 0 || j == 0) 23 { 24 if (i == 0 && j == 0) dp[i][j] = 0; 25 else if (i == 0) dp[i][j] = dp[i][j-1]; 26 else dp[i][j] = dp[i-1][j]; 27 } 28 else dp[i][j] = max(max(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]); 29 } 30 } 31 } 32 return dp[A.length()-1][B.length()-1]; 33 } 34 };
5.longest-consecutive-sequence(最长连续序列)
地址:http://www.lintcode.com/zh-cn/problem/longest-consecutive-sequence/
分析:Hash
代码:

1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers 5 * @return an integer 6 */ 7 int longestConsecutive(vector<int> &num) { 8 // write you code here 9 unordered_set<int> st; 10 for (int i = 0; i < num.size(); ++i) 11 st.insert(num[i]); 12 int ans = 0; 13 for (int i = 0; i < num.size(); ++i) 14 { 15 int left, right, val = num[i]; 16 do 17 { 18 unordered_set<int>::iterator it = st.find(val); 19 if (it == st.end()) break; 20 val--; st.erase(it); 21 }while (true); 22 left = num[i]-val; 23 val = num[i]+1; 24 do 25 { 26 unordered_set<int>::iterator it = st.find(val); 27 if (it == st.end()) break; 28 val++; st.erase(it); 29 }while(true); 30 right = val-num[i]-1; 31 if (left+right > ans) ans = left+right; 32 } 33 return ans; 34 } 35 };
6.最长上升子序列
地址:http://www.lintcode.com/zh-cn/problem/longest-increasing-subsequence/
分析:简单DP
代码:

1 class Solution { 2 public: 3 /** 4 * @param nums: The integer array 5 * @return: The length of LIS (longest increasing subsequence) 6 */ 7 int longestIncreasingSubsequence(vector<int> nums) { 8 // write your code here 9 int dp[1000]; 10 for (int i = 0; i < nums.size(); ++i) 11 { 12 dp[i] = 1; 13 for (int j = 0; j < i; ++j) 14 if (nums[i] >= nums[j]) dp[i] = max(dp[i], dp[j]+1); 15 } 16 int ans = 0; 17 for (int i = 0; i < nums.size(); ++i) 18 if (dp[i] > ans) ans = dp[i]; 19 return ans; 20 } 21 };
7.triangle-count
地址:http://www.lintcode.com/zh-cn/problem/triangle-count/
分析:暴力的。。。竟然没吃T,不知道为啥,回头再看看。。。
代码:

1 class Solution { 2 public: 3 /** 4 * @param S: A list of integers 5 * @return: An integer 6 */ 7 int triangleCount(vector<int> &S) { 8 // write your code here 9 int ans = 0; 10 sort(S.begin(), S.end()); 11 for (int i = 0; i < S.size()-2; ++i) 12 for (int k = S.size()-1; k >i+1; --k) 13 for (int j = i+1; j < k; ++j) 14 if (S[k]-S[j] < S[i]) { ans += k-j; break; } 15 return ans; 16 } 17 };
8.最近公共祖先(lowest-common-ancestor)
题目:http://www.lintcode.com/zh-cn/problem/lowest-common-ancestor/
分析:dfs即可=。=
代码:

1 class Solution { 2 public: 3 /** 4 * @param root: The root of the binary search tree. 5 * @param A and B: two nodes in a Binary. 6 * @return: Return the least common ancestor(LCA) of the two nodes. 7 */ 8 int work(TreeNode *root, TreeNode *a, TreeNode *b, TreeNode *&ans) 9 { 10 int cnt = 0; 11 if (root == NULL) return cnt; 12 if (root == a || root == b) cnt += 1; 13 int val1 = 0, val2 = 0; 14 val1 = work(root->left, a, b, ans); 15 val2 = work(root->right, a, b, ans); 16 if (cnt + val1 + val2 == 2) 17 { 18 if (ans == NULL) ans = root; 19 } 20 return cnt + val1 + val2; 21 } 22 TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) { 23 // write your code here 24 TreeNode *ans = NULL; 25 work(root, A, B, ans); 26 if (ans == NULL) return root; 27 return ans; 28 } 29 };
9. 链表翻转
地址:http://www.lintcode.com/zh-cn/problem/reverse-linked-list-ii/
分析:指针类题目,瞎搞。。。
代码:

1 /** 2 * Definition of singly-linked-list: 3 * 4 * class ListNode { 5 * public: 6 * int val; 7 * ListNode *next; 8 * ListNode(int val) { 9 * this->val = val; 10 * this->next = NULL; 11 * } 12 * } 13 */ 14 class Solution { 15 public: 16 /** 17 * @param head: The head of linked list. 18 * @param m: The start position need to reverse. 19 * @param n: The end position need to reverse. 20 * @return: The new head of partial reversed linked list. 21 */ 22 ListNode *reverseBetween(ListNode *head, int m, int n) { 23 // write your code here 24 int cnt = 1; 25 ListNode *tmp = head, *first, *pre, *temp, *g; 26 if (m == n) return head; 27 if (m == 1) first = head; 28 29 while (cnt < m) 30 { 31 if (cnt+1 == m) pre = tmp; 32 tmp = tmp->next; 33 first = tmp; 34 cnt++; 35 } 36 g = tmp->next; 37 temp = tmp->next->next; 38 while (cnt < n) 39 { 40 g->next = tmp; 41 tmp = g; g = temp; 42 if (g != NULL) temp = g->next; 43 cnt++; 44 } 45 if (m != 1) pre->next = tmp; 46 first->next = g; 47 if (m == 1) return tmp; 48 return head; 49 } 50 };
10.The Unique MST
地址:http://poj.org/problem?id=1679
分析:利用Prim算法比较最小生成树与次小生成树,加边成环,然后减边,看代价是否改变。
代码:

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <set> 7 #include <utility> 8 #include <map> 9 #include <cstdlib> 10 #include <queue> 11 #include <vector> 12 #include <numeric> 13 #include <list> 14 #include <bitset> 15 #include <exception> 16 #include <istream> 17 #include <ostream> 18 #include <stdexcept> 19 #include <functional> 20 #include <typeinfo> 21 22 #define LL long long int 23 using namespace std; 24 25 const int maxn = 110; 26 int g[maxn][maxn], mcost[maxn][maxn]; 27 int cost[maxn], pre[maxn]; 28 int m, n, sum; 29 bool vis[maxn]; 30 vector<int> vec; 31 32 void prim() 33 { 34 memset(vis, false, sizeof(vis)); 35 vis[1] = true; 36 sum = 0; 37 for (int i = 1; i <= m; ++i) 38 pre[i] = 1, cost[i] = g[1][i]; 39 vec.push_back(1); 40 41 for (int i = 1; i <= m; ++i) 42 { 43 int temp = INT_MAX, k; 44 for (int j = 1; j <= m; ++j) 45 if (!vis[j] && temp > cost[j]) 46 temp = cost[k = j]; 47 if (temp == INT_MAX) break; 48 vis[k] = true; 49 sum += temp; 50 for (int j = 0; j < vec.size(); ++j) 51 mcost[vec[j]][k] = mcost[k][vec[j]] = max(mcost[vec[j]][pre[k]], temp); 52 vec.push_back(k); 53 54 for (int j = 1; j <= m; ++j) 55 if (!vis[j] && cost[j] > g[k][j]) 56 cost[j] = g[k][j],pre[j] = k; 57 } 58 } 59 60 int main() 61 { 62 int t; 63 scanf("%d", &t); 64 while (t--) 65 { 66 scanf("%d%d", &m, &n); 67 for (int i = 0; i <= m; ++i) 68 for (int j = 0; j <= m; ++j) 69 g[i][j] = i == j ? 0 : INT_MAX, mcost[i][j] = 0; 70 int x, y, w; 71 for (int i = 0; i < n; ++i) 72 { 73 scanf("%d%d%d", &x, &y, &w); 74 g[x][y] = g[y][x] = w; 75 } 76 77 prim(); 78 79 int minn = INT_MAX; 80 for (int i = 1; i <= m; ++i) 81 for (int j = 1; j <= m; ++j) 82 if (i != j && i != pre[j] && j != pre[i]) 83 minn = min(minn, g[i][j]-mcost[i][j]); 84 if (minn != 0) printf("%d ", sum); 85 else puts("Not Unique!"); 86 } 87 88 return 0; 89 }
11.Big Christmas Tree
地址:http://poj.org/problem?id=3013
分析:dijkstra+堆优化(邻接表,若用vector则TLE=、=)
代码:

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <set> 7 #include <utility> 8 #include <map> 9 #include <cstdlib> 10 #include <queue> 11 #include <vector> 12 #include <numeric> 13 #include <list> 14 #include <bitset> 15 #include <exception> 16 #include <istream> 17 #include <ostream> 18 #include <stdexcept> 19 #include <functional> 20 #include <typeinfo> 21 22 #define LL long long int 23 using namespace std; 24 25 const long long INF = 10000000000; 26 const int M = 50005; 27 int n, m, edgeNum; 28 long long dis[M]; 29 int head[M]; 30 int visit[M]; 31 int weight[M]; 32 33 struct Edge 34 { 35 int w; 36 int to; 37 int next; 38 }edge[M*2]; 39 40 struct Node 41 { 42 int u; 43 int dis; 44 bool operator < (const Node &a) const 45 { 46 return dis>a.dis; 47 } 48 }; 49 50 void init() 51 { 52 int i; 53 edgeNum = 0; 54 for(i = 0; i < M; i++) 55 { 56 visit[i] = 0; 57 head[i] = -1; 58 dis[i] = INF; 59 } 60 } 61 void addEdge(int a, int b, int c) 62 { 63 edge[edgeNum].w = c; 64 edge[edgeNum].to = b; 65 edge[edgeNum].next = head[a]; 66 head[a] = edgeNum++; 67 } 68 void Dij(int u) 69 { 70 int i, v; 71 Node temp, now; 72 priority_queue<Node> q; 73 temp.dis = 0; 74 temp.u = u; 75 dis[u] = 0; 76 q.push(temp); 77 while (!q.empty()) 78 { 79 temp = q.top(); 80 q.pop(); 81 if (visit[temp.u]) continue; 82 visit[temp.u] = 1; 83 for (i = head[temp.u]; i != -1; i = edge[i].next) 84 { 85 v = edge[i].to; 86 if (!visit[v] && dis[v]>dis[temp.u]+edge[i].w) 87 { 88 dis[v] = dis[temp.u]+edge[i].w; 89 now.dis = dis[v]; 90 now.u = v; 91 q.push(now); 92 } 93 } 94 } 95 return ; 96 } 97 int main() 98 { 99 int T, a, b, c, i; 100 scanf("%d", &T); 101 while (T--) 102 { 103 104 scanf("%d%d", &n, &m); 105 init(); 106 for(i = 0; i < n; i++) 107 scanf("%d", &weight[i]); 108 for(i = 0; i < m; i++) 109 { 110 scanf("%d%d%d", &a, &b, &c); 111 a--; b--; 112 addEdge(a, b, c); 113 addEdge(b, a, c); 114 } 115 Dij(0); 116 long long res=0; 117 for(i = 0; i < n; i++) 118 { 119 if(dis[i] == INF) break; 120 res += dis[i]*weight[i]; 121 } 122 if(i == n) printf("%lld ", res); 123 else puts("No Answer"); 124 } 125 return 0; 126 }
12.linked-list-cycle-ii(带环链表)
地址:http://www.lintcode.com/zh-cn/problem/linked-list-cycle-ii/#
分析:快慢指针
代码:

1 class Solution { 2 public: 3 /** 4 * @param head: The first node of linked list. 5 * @return: The node where the cycle begins. 6 * if there is no cycle, return null 7 */ 8 ListNode *detectCycle(ListNode *head) { 9 // write your code here 10 ListNode *t1 = head, *t2 = head; 11 while (t1 && t2 && t2->next) 12 { 13 t1 = t1->next; 14 t2 = t2->next->next; 15 if (t1 == t2) 16 { 17 t1 = head; 18 while (true) 19 { 20 t1 = t1->next; 21 t2 = t2->next; 22 if (t1 == t2) return t1; 23 } 24 } 25 } 26 return NULL; 27 } 28 };
13.Balanced Lineup
地址:http://poj.org/problem?id=3264
分析:线段树,注意N的范文,题目写的1-50,000, 结果测试数据却是1-200,000 !!!MADAN...
代码:

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <set> 7 #include <utility> 8 #include <map> 9 #include <cstdlib> 10 #include <queue> 11 #include <vector> 12 #include <numeric> 13 #include <list> 14 #include <bitset> 15 #include <exception> 16 #include <istream> 17 #include <ostream> 18 #include <stdexcept> 19 #include <functional> 20 #include <typeinfo> 21 22 #define LL long long int 23 using namespace std; 24 25 const int maxn = 200005; 26 27 typedef struct node 28 { 29 int min_val, max_val, left, right; 30 }node; 31 32 node stree[maxn<<2]; 33 int n, q; 34 int val[maxn]; 35 36 void build(int root, int left, int right) 37 { 38 if (left == right) 39 { 40 stree[root].max_val = stree[root].min_val = val[left]; 41 stree[root].left = left, stree[root].right = right; 42 return ; 43 } 44 build(root*2, left, (left+right)/2); 45 build(root*2+1, (left+right)/2+1, right); 46 stree[root].left = left, stree[root].right = right; 47 stree[root].min_val = min(stree[root*2].min_val, stree[root*2+1].min_val); 48 stree[root].max_val = max(stree[root*2].max_val, stree[root*2+1].max_val); 49 } 50 51 void query(int root, int left, int right, int& max_num, int& min_num) 52 { 53 if (stree[root].max_val <= max_num && stree[root].min_val >= min_num) return ; 54 if (stree[root].left > right || stree[root].right < left) return ; 55 if (left <= stree[root].left && right >= stree[root].right) 56 { 57 max_num = max(max_num, stree[root].max_val); 58 min_num = min(min_num, stree[root].min_val); 59 } 60 int mid = (stree[root].left + stree[root].right)/2; 61 if (right <= mid) query(root*2, left, right, max_num, min_num); 62 else if (left > mid)query(root*2+1, left, right, max_num, min_num); 63 else 64 { 65 query(root*2, left, right, max_num, min_num); 66 query(root*2+1, left, right, max_num, min_num); 67 } 68 } 69 70 int main() 71 { 72 scanf("%d%d", &n, &q); 73 for (int i = 1; i <= n; ++i) 74 scanf("%d", &val[i]); 75 build(1, 1, n); 76 77 int left, right, max_num, min_num; 78 for (int i = 0; i < q; ++i) 79 { 80 max_num = -1, min_num = 2e9; 81 scanf("%d%d", &left, &right); 82 query(1, left, right, max_num, min_num); 83 printf("%d ", max_num-min_num); 84 } 85 return 0; 86 }
14.Add Digits
地址:https://leetcode.com/problems/add-digits/
分析:谁都会做的水题。
代码:

1 public class Solution { 2 public int addDigits(int num) { 3 int ans = 0; 4 while (num > 9) 5 { 6 while (num != 0) 7 { 8 ans += num%10; 9 num /= 10; 10 } 11 num = ans; 12 ans = 0; 13 } 14 return num; 15 } 16 }
15.Majority Element
地址:https://leetcode.com/problems/majority-element/
分析:计数原理
代码:

1 public class Solution { 2 public int majorityElement(int[] nums) { 3 int val = nums[0]; 4 int cnt = 1; 5 for (int i = 1; i < nums.length; ++i) 6 { 7 if (nums[i] == val) cnt++; 8 else cnt--; 9 if (cnt == 0) { val = nums[i]; cnt = 1; } 10 } 11 return val; 12 } 13 }
16.Binary Tree Paths
地址:https://leetcode.com/problems/binary-tree-paths/
分析:简单题,dfs
代码:

1 class Solution { 2 public: 3 string int2str(int val) 4 { 5 int flag = 0; 6 if (val == 0) return "0"; 7 if (val < 0) flag = 1, val = -val; 8 string ret = ""; 9 while (val) 10 { 11 ret += (char)(val%10+'0'); 12 val /= 10; 13 } 14 if (flag) ret += "-"; 15 reverse(ret.begin(), ret.end()); 16 return ret; 17 } 18 void work(TreeNode* root, vector<int>& add, vector<vector<int>>& vec) 19 { 20 if (root == NULL) return ; 21 if (!root->left && !root->right) 22 { 23 add.push_back(root->val); 24 vec.push_back(add); 25 add.pop_back(); 26 return ; 27 } 28 add.push_back(root->val); 29 work(root->left, add, vec); 30 work(root->right, add, vec); 31 add.pop_back(); 32 } 33 vector<string> binaryTreePaths(TreeNode* root) { 34 vector<vector<int>> vec; 35 vector<int> add; 36 work(root, add, vec); 37 vector<string> ans; 38 for (int i = 0; i < vec.size(); ++i) 39 { 40 string str = ""; 41 if (vec[i].size() != 0) 42 { 43 str += int2str(vec[i][0]); 44 for (int j = 1; j < vec[i].size(); ++j) 45 str = str + "->" + int2str(vec[i][j]); 46 ans.push_back(str); 47 } 48 } 49 return ans; 50 } 51 };
17.Ugly Number
地址:https://leetcode.com/problems/ugly-number/
分析:水题。
代码:

1 class Solution { 2 public: 3 bool isUgly(int num) { 4 if (num <= 0) return false; 5 while (num%2 == 0) num /= 2; 6 while (num%3 == 0) num /= 3; 7 while (num%5 == 0) num /= 5; 8 if (num == 1) return true; 9 return false; 10 } 11 };
18.First Bad Version
地址:https://leetcode.com/problems/first-bad-version/
分析:二分
代码:

1 bool isBadVersion(int version); 2 3 class Solution { 4 public: 5 int firstBadVersion(int n) { 6 long long int l = 1, r = n; 7 while (l < r) 8 { 9 long long int m = (l+r)>>1; 10 if (isBadVersion(m) == false) l = m+1; 11 else r = m; 12 } 13 return l; 14 } 15 };
19.Generate Parentheses
地址:https://leetcode.com/problems/generate-parentheses/
分析:DFS一下,判断几种情况。
代码:

1 class Solution { 2 public: 3 void work(vector<string>& ans, string add, int val1, int val2, int n) 4 { 5 if (val1 == val2 && val1 == n) 6 { 7 ans.push_back(add); 8 return ; 9 } 10 if (val1 == val2) 11 work(ans, add+"(", val1+1, val2, n); 12 else if (val1 == n) 13 { 14 string s(n-val2, ')'); 15 work(ans, add+s, val1, n, n); 16 } 17 else 18 { 19 work(ans, add+"(", val1+1, val2, n); 20 work(ans, add+")", val1, val2+1, n); 21 } 22 } 23 vector<string> generateParenthesis(int n) { 24 string add = ""; 25 vector<string> ans; 26 work(ans, add, 0, 0, n); 27 return ans; 28 } 29 };
20.Surprising Strings
地址:http://poj.org/problem?id=3096
分析:水题,用STL//poj不支持c++ 11
代码:

1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <vector> 8 #include <map> 9 #include <set> 10 #include <stack> 11 #include <queue> 12 #include <unordered_map> 13 #include <unordered_set> 14 15 using namespace std; 16 17 int main() 18 { 19 string str; 20 while (cin>>str && str != "*") 21 { 22 bool flag = true; 23 set<string> st; 24 for (int i = 1; i < str.length() && flag; ++i) 25 { 26 st.clear(); 27 for (int j = 0; j < str.length()-i && flag; ++j) 28 { 29 string temp = ""; 30 temp = temp + str[j] + str[i+j]; 31 if (st.count(temp)) 32 flag = false; 33 else 34 st.insert(temp); 35 } 36 } 37 cout << str; 38 if (flag) printf(" is surprising. "); 39 else printf(" is NOT surprising. "); 40 } 41 42 return 0; 43 }
21.Ugly Number
地址:http://www.lintcode.com/zh-cn/problem/ugly-number/
分析:利用队列,3个队列,分别保存*3, *5,*7的数字,每次选择最小的一个push进vector,然后将其*3, *5,*7push到queue,直到vector的大小到k+1
代码:

1 class Solution { 2 public: 3 /* 4 * @param k: The number k. 5 * @return: The kth prime number as description. 6 */ 7 long long kthPrimeNumber(int k) { 8 // write your code here 9 queue<long long int> q1, q2, q3; 10 vector<long long int> v; 11 long long int t1, t2, t3, tmp; 12 v.push_back(1); 13 int cnt = 0; 14 while (cnt < k) 15 { 16 q1.push(v.back()*3); 17 q2.push(v.back()*5); 18 q3.push(v.back()*7); 19 tmp = min(min(q1.front(), q2.front()), q3.front()); 20 v.push_back(tmp); 21 if (tmp == q1.front()) q1.pop(); 22 if (tmp == q2.front()) q2.pop(); 23 if (tmp == q3.front()) q3.pop(); 24 cnt++; 25 } 26 return tmp; 27 } 28 };
22.Missing Number
地址:https://leetcode.com/problems/missing-number/
分析:O(n), 利用nums的数据大小为0……n来做。
代码:

1 class Solution { 2 public: 3 int missingNumber(vector<int>& nums) { 4 for (int i = 0; i < nums.size(); ++i) 5 { 6 while (nums[i] != i) 7 { 8 if (nums[i] == nums.size()) break; 9 swap(nums[i], nums[nums[i]]); 10 } 11 } 12 for (int i = 0; i < nums.size(); ++i) 13 if (i != nums[i]) return i; 14 return nums.size(); 15 } 16 };
23.Number of Islands
地址:https://leetcode.com/problems/number-of-islands/
分析:BFS即可
代码:

1 class Solution { 2 public: 3 int numIslands(vector<vector<char>>& grid) { 4 if (grid.size() == 0) return 0; 5 int ans = 0; 6 int m = grid.size(), n = grid[0].size(); 7 for (int i = 0; i < m; ++i) 8 { 9 for (int j = 0; j < n; ++j) 10 { 11 queue<pair<int, int>> qu; 12 while (!qu.empty()) qu.pop(); 13 if (grid[i][j] == '1') 14 { 15 grid[i][j] = '0'; 16 ans++; 17 qu.push(make_pair(i, j)); 18 while (!qu.empty()) 19 { 20 int x = qu.front().first; 21 int y = qu.front().second; 22 qu.pop(); 23 if (x-1 >= 0 && grid[x-1][y] == '1') qu.push(make_pair(x-1, y)), grid[x-1][y] = '0'; 24 if (x+1 < m && grid[x+1][y] == '1') qu.push(make_pair(x+1, y)), grid[x+1][y] = '0'; 25 if (y+1 < n && grid[x][y+1] == '1') qu.push(make_pair(x, y+1)), grid[x][y+1] = '0'; 26 if (y-1 >= 0 && grid[x][y-1] == '1') qu.push(make_pair(x, y-1)), grid[x][y-1] = '0'; 27 } 28 } 29 } 30 } 31 return ans; 32 } 33 };
24.H-Index
地址:https://leetcode.com/problems/h-index/

1 //分析:排序一下,然后n从大到小开始验证,如果OK,就return。 2 class Solution { 3 public: 4 int hIndex(vector<int>& citations) { 5 sort(citations.begin(), citations.end()); 6 int size = citations.size(); 7 for (int n = size; n >= 1; --n) 8 { 9 if (citations[size-n] >= n) return n; 10 } 11 return 0; 12 } 13 };
25.H-Index II
地址:https://leetcode.com/problems/h-index-ii/

1 //分析:类似于上题,不过已经排序了,题目要求O(lgn),用binary search即可。 2 class Solution { 3 public: 4 int hIndex(vector<int>& citations) { 5 if (citations.size() == 0) return 0; 6 int size = citations.size(); 7 int l = 1, r = size, m = (l+r)>>1; 8 while (l < r) 9 { 10 m = (l + r) >> 1; 11 if (citations[size-m] >= m) l = m+1; 12 else r = m-1; 13 } 14 if (citations[size-l] >= l) return l; 15 return l-1; 16 } 17 };
26.Rotate List
地址:https://leetcode.com/problems/rotate-list/

1 //分析:链表题。 2 class Solution { 3 public: 4 ListNode* rotateRight(ListNode* head, int k) { 5 if (head == NULL) return head; 6 int len = 0; 7 ListNode *t1 = head, *t2 = head; 8 while (t1) t1 = t1->next, len++; 9 k %= len; 10 len = 0; 11 t1 = head; 12 if (k == 0) return head; 13 while (t2 && len < k) 14 { 15 t2 = t2->next; 16 len++; 17 } 18 if (t2 == NULL) return head; 19 while (t2->next) 20 { 21 t1 = t1->next; 22 t2 = t2->next; 23 } 24 ListNode *ret = t1->next; 25 t1->next = NULL; 26 t2->next = head; 27 return ret; 28 } 29 };
27.Ugly Number II
地址:https://leetcode.com/problems/ugly-number-ii/

1 //分析:上面貌似有个几乎一样的题,差距就在1是否为ugly number 2 class Solution { 3 public: 4 int nthUglyNumber(int n) { 5 vector<long long int> v; 6 queue<long long int> q2, q3, q5; 7 v.push_back(1); 8 int cnt = 1; 9 while (cnt < n) 10 { 11 q2.push(2*v.back()); 12 q3.push(3*v.back()); 13 q5.push(5*v.back()); 14 long long int tmp = min(min(q2.front(), q3.front()), q5.front()); 15 v.push_back(tmp); 16 if (tmp == q2.front()) q2.pop(); 17 if (tmp == q3.front()) q3.pop(); 18 if (tmp == q5.front()) q5.pop(); 19 cnt++; 20 } 21 return v.back(); 22 } 23 };
28.Binary Tree Right Side View

1 //BFS即可 2 class Solution { 3 public: 4 vector<int> rightSideView(TreeNode* root) { 5 vector<int> ans; 6 if (root == NULL) return ans; 7 queue<TreeNode *> q1, q2; 8 q1.push(root); 9 while (!q1.empty()) 10 { 11 if (q1.size() == 1) ans.push_back(q1.front()->val); 12 if (q1.front()->left != NULL) q2.push(q1.front()->left); 13 if (q1.front()->right != NULL) q2.push(q1.front()->right); 14 q1.pop(); 15 if (q1.empty() && !q2.empty()) 16 { 17 q1 = q2; 18 while (!q2.empty()) q2.pop(); 19 } 20 } 21 return ans; 22 } 23 };

1 //简单DFS 2 class Solution { 3 public: 4 void work(int idx, int sum, int cnt, vector<vector<int>>& ans, vector<int>& add, int k, int n) 5 { 6 if (cnt > k || sum > n) return ; 7 if (sum == n && cnt == k) 8 { 9 ans.push_back(add); 10 return ; 11 } 12 if (cnt == k && sum != n) return ; 13 for (int i = idx; i <= 9 && sum+i <= n; ++i) 14 { 15 add.push_back(i); 16 work(i+1, sum+i, cnt+1, ans, add, k, n); 17 add.pop_back(); 18 } 19 } 20 vector<vector<int>> combinationSum3(int k, int n) { 21 vector<vector<int>> ans; 22 vector<int> add; 23 work(1, 0, 0, ans, add, k, n); 24 return ans; 25 } 26 };
30.Binary Search Tree Iterator

1 //一开始想错了,其实has_next,next,其实就是获取当前最小值,然后删除了这个最小值 2 //那么用栈就很容易解决了 3 /** 4 * Definition for binary tree 5 * struct TreeNode { 6 * int val; 7 * TreeNode *left; 8 * TreeNode *right; 9 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 10 * }; 11 */ 12 class BSTIterator { 13 public: 14 stack<TreeNode *> st; 15 int next_num; 16 BSTIterator(TreeNode *root) { 17 while (root) 18 { 19 st.push(root); 20 root = root->left; 21 } 22 } 23 24 /** @return whether we have a next smallest number */ 25 bool hasNext() { 26 if (!st.empty()) 27 { 28 TreeNode *t = st.top(); 29 st.pop(); 30 next_num = t->val; 31 TreeNode *tmp = t->right; 32 if (tmp) 33 { 34 while (tmp) 35 { 36 st.push(tmp); 37 tmp = tmp->left; 38 } 39 } 40 return true; 41 } 42 return false; 43 } 44 45 /** @return the next smallest number */ 46 int next() { 47 return next_num; 48 } 49 }; 50 51 /** 52 * Your BSTIterator will be called like this: 53 * BSTIterator i = BSTIterator(root); 54 * while (i.hasNext()) cout << i.next(); 55 */
31.Unique Binary Search Trees II

1 //递归的思想,瞎搞 2 class Solution { 3 public: 4 vector<TreeNode*> work(int left, int right) 5 { 6 vector<TreeNode*> ret; 7 if (left > right) 8 { 9 ret.push_back(NULL); 10 return ret; 11 } 12 if (left == right) 13 { 14 TreeNode* tmp = new TreeNode(left); 15 ret.push_back(tmp); 16 return ret; 17 } 18 for (int i = left; i <= right; ++i) 19 { 20 vector<TreeNode*> t1 = work(left, i-1); 21 vector<TreeNode*> t2 = work(i+1, right); 22 23 for (int x = 0; x < t1.size(); ++x) 24 { 25 for (int y = 0; y < t2.size(); ++y) 26 { 27 TreeNode* tmp = new TreeNode(i); 28 tmp->left = t1[x]; 29 tmp->right = t2[y]; 30 ret.push_back(tmp); 31 } 32 } 33 } 34 return ret; 35 } 36 vector<TreeNode*> generateTrees(int n) { 37 return work(1, n); 38 } 39 };

1 //链表类题目,还是瞎搞就行 2 class Solution { 3 public: 4 bool find(ListNode *head, int x) 5 { 6 ListNode *tmp = head; 7 while (tmp) 8 { 9 if (tmp->val < x) return true; 10 tmp = tmp->next; 11 } 12 return false; 13 } 14 ListNode* partition(ListNode* head, int x) { 15 ListNode *tmp = head, *pre = NULL, *root = NULL; 16 while (tmp) 17 { 18 while (tmp && tmp->val < x) pre = tmp, tmp = tmp->next; 19 if (tmp == NULL) break; 20 if (find(tmp, x)) 21 { 22 ListNode *t = tmp; 23 while (t->next->val >= x) t = t->next; 24 ListNode* tt = t->next; 25 t->next = t->next->next; 26 if (pre == NULL) 27 { 28 root = tt; 29 tt->next = tmp; 30 pre = root; 31 } 32 else 33 { 34 pre->next = tt; 35 tt->next = tmp; 36 pre = tt; 37 } 38 } 39 else break; 40 } 41 if (root != NULL) return root; 42 return head; 43 } 44 };
33.Construct Binary Tree from Preorder and Inorder Traversal

1 //Talk is cheap. Show me code. 2 class Solution { 3 public: 4 TreeNode* build(vector<int>& preorder, vector<int>& inorder, int left1, int right1, int left2, int right2) 5 { 6 if (left1 > right1) return NULL; 7 TreeNode *tmp = new TreeNode(preorder[left1]); 8 if (left1 == right1) return tmp; 9 int i, j; 10 for (i = left2; i <= right2; ++i) 11 if (inorder[i] == preorder[left1]) break; 12 for (j = left1+1; j <= right1; j++) 13 if (j-(left1+1) == i-left2) break; 14 tmp->left = build(preorder, inorder, left1+1, j-1, left2, i-1); 15 tmp->right = build(preorder, inorder, j, right1, i+1, right2); 16 return tmp; 17 } 18 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 19 return build(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1); 20 } 21 };

1 //用Map做比较简单,map<string, vector<string>>; 然后排下序 2 class Solution { 3 public: 4 vector<vector<string>> groupAnagrams(vector<string>& strs) { 5 map<string, vector<string>> mp; 6 for (int i = 0; i < strs.size(); ++i) 7 { 8 string str = strs[i]; 9 sort(str.begin(), str.end()); 10 if (mp.count(str)) 11 mp[str].push_back(strs[i]); 12 else 13 { 14 vector<string> v; 15 v.push_back(strs[i]); 16 mp.insert(make_pair(str, v)); 17 } 18 } 19 vector<vector<string>> ans; 20 for (map<string, vector<string>>::iterator it = mp.begin(); it != mp.end(); ++it) 21 { 22 sort((it->second).begin(), (it->second).end()); 23 ans.push_back(it->second); 24 } 25 return ans; 26 } 27 };

1 //逆置链表 2 class Solution { 3 public: 4 ListNode* reverseKGroup(ListNode* head, int k) { 5 if (head == NULL) return head; 6 int len = 0; 7 ListNode *tt = head; 8 while (tt) { tt=tt->next; len++; } 9 if (k > len) return head; 10 if (k < 2) return head; 11 int cnt = 1; 12 ListNode *t1 = head, *t2 = head->next, *pre = NULL; 13 while (cnt < k) 14 { 15 pre = t2->next; 16 t2->next = t1; 17 t1 = t2; 18 t2 = pre; 19 cnt++; 20 } 21 head->next = reverseKGroup(t2, k); 22 return t1; 23 } 24 };
36.Move Zeroes

1 //two points 2 class Solution { 3 public: 4 void moveZeroes(vector<int>& nums) { 5 int i= 0, j = 0, size = nums.size(); 6 while (true) 7 { 8 while (i < size && nums[i] != 0) ++i; 9 j = i; 10 while (j < size && nums[j] == 0) ++j; 11 if (i == size || j == size) break; 12 swap(nums[i], nums[j]); 13 } 14 } 15 };
37.Search in Rotated Sorted Array II

1 //二分 2 class Solution { 3 public: 4 bool search(vector<int>& nums, int target) { 5 if (nums.size() == 0) return false; 6 int l = 0, r = nums.size()-1; 7 while (l <= r) 8 { 9 int m = (l+r) >> 1; 10 if (nums[m] == target) return true; 11 if (nums[l] == nums[r] && nums[m] == nums[r]) l++, r--; 12 else if (nums[l] <= nums[m]) 13 { 14 if (nums[l] <= target && target < nums[m]) r = m-1; 15 else l = m+1; 16 } 17 else 18 { 19 if (nums[r] >= target && nums[m] < target) l = m+1; 20 else r = m-1; 21 } 22 } 23 return false; 24 } 25 };
38.Find Minimum in Rotated Sorted Array II

1 //二分 2 class Solution { 3 public: 4 int findMin(vector<int>& nums) { 5 int l = 0, r = nums.size()-1; 6 while (l <= r) 7 { 8 if (l == r) return nums[l]; 9 if (l+1 == r) return min(nums[l], nums[r]); 10 int m = (l+r) >> 1; 11 if (nums[l] == nums[r] && nums[r] == nums[m]) { l++, r--; continue; } 12 if (nums[l] >= nums[m] && nums[m] <= nums[r]) r = m; 13 else if (nums[l] >= nums[m] && nums[m] > nums[r]) l = m; 14 else if (nums[l] < nums[m] && nums[l] >= nums[r]) l = m; 15 else if (nums[l] < nums[m] && nums[l] < nums[r]) r = m; 16 } 17 return nums[l]; 18 } 19 };

1 //BFS && DP 2 class Solution { 3 public: 4 int numSquares(int n) { 5 vector<int> vis(n+1, 0); 6 queue<pair<int, int>> qu; 7 if ((int)sqrt(n)*sqrt(n) == n) return 1; 8 qu.push(make_pair(n, 1)); 9 while (!qu.empty()) 10 { 11 int val = qu.front().first; 12 int dep = qu.front().second; 13 if ((int)sqrt(val)*sqrt(val) == val) return dep; 14 for (int i = sqrt(val); i*i > 0; --i) 15 { 16 if (vis[val-i*i]) continue; 17 vis[val-i*i] = 1; 18 qu.push(make_pair(val-i*i, dep+1)); 19 } 20 qu.pop(); 21 } 22 } 23 };

1 //将2*n+2问题转化为2*n+1问题,所有数异或,得到最后结果,然后找最后一个非零位////置。根据这个位置做分类,所有这个位置为零的为一组,所有这个位置为一的为一组。 2 class Solution { 3 public: 4 vector<int> singleNumber(vector<int>& nums) 5 { 6 int len = nums.size(); 7 int AxorB = 0; 8 for(int i=0; i<len; i++) 9 AxorB ^= nums[i]; 10 int mask = AxorB & (~(AxorB-1)); 11 int A = 0; 12 int B = 0; 13 for(int i=0; i<len; i++) 14 { 15 if((mask&nums[i])==0) 16 A ^= nums[i]; 17 else 18 B ^= nums[i]; 19 } 20 return vector<int>({A, B}); 21 } 22 };