• LeetCode Weekly Contest 20


    1. 520. Detect Capital

    题目描述的很清楚,直接写,注意:字符串长度为1的时候,大写和小写都是满足要求的,剩下的情况单独判断。还有:我感觉自己写的代码很丑,判断条件比较多,需要改进,精简再精简。

     1 class Solution {
     2 public:
     3 bool detectCapitalUse(string word) {
     4     int n = word.size();
     5     if(n == 1) return 1;
     6     if(word[0] <= 'Z') {
     7         bool f = 1;
     8         for (int i = 1; i < n; i++) {
     9             if(word[i] >= 'a') {}
    10             else {
    11                 f = 0; break;
    12             }
    13         }
    14         if(f) return 1;
    15         f = 1;
    16         for (int i = 1; i < n; i++) {
    17             if(word[i] < 'a') {}
    18             else {
    19                 f = 0; break;
    20             }
    21         }
    22         if(f) return 1;
    23     } else {
    24         bool f = 1;
    25         for (int i = 1; i < n; i++) {
    26             if(word[i] < 'a') {
    27                 f = 0; break;
    28             }
    29         }
    30         if(f) return 1;
    31     }
    32     return 0;
    33 }
    34 };
    View Code

    2. 526. Beautiful Arrangement

    看完题目,感觉数据范围很小,1<<15 = 32000,(这里不对,应该是15!,这个数字很大,暴力是不行的,之前的分析是错的!)比较小的,使用next_permutation暴力,枚举, 然后tle, 我就想着本地打表计算,直接输出结果,谁知道13,14,15的结果根本出不来。

    后来看11,12的答案挺小,然后想着预处理出每个位置可以放的数字,然后dfs进行解的搜索,本地测试1-15,出解的速度很快,然后提交,就ac了。

     1 class Solution {
     2 public:
     3 vector<int> e[20];
     4 bool in[20];
     5 int res;
     6 int tn;
     7 void work(int u) {
     8     if(u > tn) {
     9         bool f = 1;
    10         for (int i = 1; i <= tn; i++) {
    11             if(!in[i]) {
    12                 f = 0; break;
    13             }
    14         }
    15         res += f;
    16         return;
    17     }
    18     for (int x : e[u]) {
    19         if(in[x]) continue;
    20         in[x] = 1;
    21         work(u + 1);
    22         in[x] = 0;
    23     }
    24 }
    25 int countArrangement(int n) {
    26     if(n < 3) return n;
    27     tn = n;
    28     for (int i = 1; i <= n; i++) {
    29         e[i].clear();
    30         for (int j = 1; j <= n; j++) {
    31             if(j % i == 0 || i % j == 0)
    32                 e[i].push_back(j);
    33         }
    34     }
    35     memset(in, 0, sizeof in);
    36     work(1);
    37     return res;
    38 }
    39 };
    View Code

    3. 525. Contiguous Array

    这道题是原题,但是看完,想不出来递推方程,只好找以前的答案,幸好保存了,我是传送门 http://www.cnblogs.com/y119777/p/5851025.html,多亏当初还仔细分析了一下,考虑了各种情况。

    然后抄,提交,ac。

     1 class Solution {
     2 public:
     3 int getLongestString(vector<int> & v) {
     4     int n = v.size();
     5     if(n < 2) return 0;
     6     map<int, int> m;
     7     int s = 0;
     8     int res = 0;
     9     for(int i = 0; i < n; i++) {
    10         s += v[i];
    11         if(s == 0) {
    12             res = max(res, i + 1); continue;
    13         }
    14         if(!m.count(s)) {
    15             m[s] = i;
    16         } else {
    17             int len = i - m[s];
    18             res = max(res, len);
    19         }
    20     }
    21     return res;
    22 }
    23     int findMaxLength(vector<int>& nums) {
    24         int n = nums.size();
    25         if(n < 2) return 0;
    26         for (int i = 0; i < n; i++)
    27             if(nums[i] == 0) nums[i] = -1;
    28         return getLongestString(nums);
    29     }
    30 };
    View Code

    4。 517. Super Washing Machines

    先看数据范围[0,1e4], [1, 1e5], 1e9,使用int,不会溢出。(时刻牢记这个坑,有时候最后结果不会溢出,但是,中间结果可能溢出)。n^2的复杂度有点高,而且。我也不知道n^2的解法怎么写!

    一看hard,想不出思路,感觉要跪!这时候,一定提醒自己,静下心来,从最简单的例子入手,分析,有什么优秀的性质可以利用,考虑解法。

    第一:不难想到,长度小于2,直接返回0,然后求和,结果不是长度的倍数,就直接返回-1,剩下的情况一定可以出结果。

    第二:想不出n^2的方法,那就是复杂度为n的枚举方法,按这种枚举出来的结果,就是最优的。然后记 s = s / n; s为每个数字最后的目标,小于s的需要,至少需要s-a次,大于s的需要a-s次,然后考虑是否可以同时进行,由于每个数字互不干扰,每个数字每次移出只能移出1,所以只需要统计每个数字移出的次数,最后的结果就是最大的那个数字。仔细,思考一下,最好画一画。

     1 class Solution {
     2 public:
     3 int findMinMoves(vector<int>& mach) {
     4     int n = mach.size();
     5     if(n < 2) return 0;
     6     int s = 0;
     7     for (int x : mach)
     8         s += x;
     9     if(s % n != 0) {
    10         return -1;
    11     }
    12     if(s == 0) return 0;
    13     vector<int> c(n, 0);
    14     s /= n;
    15     int res = 0;
    16     for (int i = 0; i < n; i++) {
    17 
    18         int t = mach[i] + c[i];
    19 
    20         if(t == s) {
    21 
    22         } else if(t < s) {
    23             c[i + 1] -= s - t;
    24         } else if(t > s) {
    25             c[i] -= t - s;
    26             mach[i + 1] += t - s;
    27             //c[i + 1] += t - s;
    28         }
    29         res = max(res, abs(c[i]));
    30         //cout << c[i] << endl;
    31 
    32     }
    33     return res;
    34 }
    35 };
    View Code
  • 相关阅读:
    POJ 1182 食物链 +POJ 2492 A Bug's Life 种类并查集
    Codeforces 884C Bertown Subway dfs判环
    HDU 2102 A计划 bfs
    Codeforces Round #442 (Div. 2) 877E
    Codeforces Round #443 (Div. 2) B. Table Tennis
    Codeforces Round #442 (Div. 2) D. Olya and Energy Drinks
    HDU 1495 非常可乐 BFS/数论
    Codeforces Round #442 (Div. 2) B. Nikita and string DP
    51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈
    HDU 1286 找新朋友
  • 原文地址:https://www.cnblogs.com/y119777/p/6415671.html
Copyright © 2020-2023  润新知