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