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
原文地址:https://www.cnblogs.com/y119777/p/6415671.html