zoukankan      html  css  js  c++  java
  • 9.14-9.20

    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 };
    View Code

    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 };
    View Code

    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 }
    View Code

    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 };
    View Code

    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 };
    View Code

     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 };
    View Code

     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 };
    View Code

    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 };
    View Code

     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 };
    View Code

    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 }
    View Code

    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 }
    View Code

     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 };
    View Code

     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 }
    View Code

     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 }
    View Code

     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 }
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     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 }
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

    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 };
    View Code

     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 };
    View Code

     29.Combination Sum III

     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 };
    View Code

     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  */
    View Code

     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 };
    View Code

     32.Partition List

     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 };
    View Code

     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 };
    View Code

     34.Group Anagrams

     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 };
    View Code

     35.Reverse Nodes in k-Group

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     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 };
    View Code

     39.Perfect Squares

     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 };
    View Code

     40.Single Number III

     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 };
    View Code
  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/JustForCS/p/4806297.html
Copyright © 2011-2022 走看看