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
  • 相关阅读:
    SVN: repository browser 库浏览器
    创业泡沫真他妈的大出血来了 --个人需要创业以谋生,行业需要创业以求变,国家需要创业以维稳
    判断输入的是否是大于0的正整数
    linux开放或限制端口和ip访问
    linux模糊删除es索引脚本
    ssh免密登录
    DES加密解密
    SpringBoot 单元测试
    SpringContextHolder 工具类
    fiddler抓包 443 请求不到数据
  • 原文地址:https://www.cnblogs.com/JustForCS/p/4806297.html
Copyright © 2011-2022 走看看