1. 532. K-diff Pairs in an Array

分析:由于要唯一,所以要去重,考虑k=0,时候,相同的数字需要个数大于1,所以,先用map统计个数,对于k=0,特判,对于其他的,遍历每一个数,只需要判断a + k是否存在即可。

这个题目,是absolute difference,我没注意这点,没有判断k<0,直接return 0,导致出错。

  1. class Solution {
  2. public:
  3. int findPairs(vector<int>& nums, int k) {
  4. if(k < ) return ;
  5. int n = nums.size();
  6. int res = ;
  7. map<int, int> ma;
  8. for (int x : nums) {
  9. ma[x]++;
  10. }
  11. if(k == ) {
  12. for (auto it : ma) {
  13. if(it.second > ) res++;
  14. }
  15. return res;
  16. }
  17. for (auto it : ma) {
  18. int x = it.first;
  19. if(ma.count(x + k)) res++;
  20. }
  21. return res;
  22. }
  23. };

2. 531. Lonely Pixel I

预处理出行列元素个数,然后扫描每一个元素进行处理,比较简单。

  1. class Solution {
  2. public:
  3. int findLonelyPixel(vector<vector<char>>& p) {
  4. int n = p.size();
  5. if(n == ) return ;
  6. int m = p[].size();
  7. if(m == ) return ;
  8. vector<int> row(n, ), col(m, );
  9. for (int i = ; i < n; i++) {
  10. for (int j = ; j < m; j++) {
  11. if(p[i][j] == 'B') {
  12. row[i]++;
  13. col[j]++;
  14. }
  15. }
  16. }
  17. int res = ;
  18. for (int i = ; i < n; i++) {
  19. for (int j = ; j < m; j++) {
  20. if(p[i][j] == 'B') {
  21. if(row[i] == && col[j] == ) res++;
  22. }
  23. }
  24. }
  25. return res;
  26. }
  27. };

3. 533. Lonely Pixel II

也是要先预处理出每行,每列的b的个数,然后进行处理。

分析这个题目,是要按列进行考虑的,因为满足要求的b的列的位置上为b的这些行要相同,所以如果只要有一个不满足要求,这一列的b都是不满足要求的。

同时注意到,每2行可能需要比较多次,每次都是相同重复的,可以记录下来,进行加速处理。也算比较简单。

  1. class Solution {
  2. public:
  3. int findBlackPixel(vector<vector<char>>& p, int k) {
  4. int n = p.size();
  5. if(n == ) return ;
  6. int m = p[].size();
  7. if(m == ) return ;
  8. vector<int> row(n, ), col(m, );
  9. for (int i = ; i < n; i++) {
  10. for (int j = ; j < m; j++) {
  11. if(p[i][j] == 'B') {
  12. row[i]++;
  13. col[j]++;
  14. }
  15. }
  16. }
  17. int res = ;
  18. map<pair<int, int>, bool> ma;
  19. for (int j = ; j < m; j++) {
  20. if(col[j] != k) continue;
  21. int id = -;
  22. bool f = ;
  23. for (int i = ; i < n; i++) {
  24. if(p[i][j] == 'B') {
  25. if(row[i] != k) {
  26. f = ;break;
  27. }
  28. if(id == -) id = i;
  29. else {
  30. if(ma.count({id, i})) {
  31. if(!ma[{id, i}]) {
  32. f = ;
  33. break;
  34. }
  35. }
  36. for (int x = ; x < m; x++) {
  37. if(p[id][x] != p[i][x]) {
  38. ma[{id, i}] = ;
  39. f = ;
  40. break;
  41. }
  42. }
  43. if(f) {
  44. ma[{id, i}] = ;
  45. } else
  46. break;
  47. }
  48. }
  49. }
  50. if(f) res += k;
  51. }
  52. return res;
  53. }
  54. };

4. 514. Freedom Trail

分析:读懂题意,这么多英文描述,我一看,脑袋都花了!

然后,我想着是不是贪心,每次都转移到最近的一个字母,但是提交以后,wa。然后观察例子,分析出是dp。

因为这一次的转移会影响下一次的转移,局部是最优的,但是不能保证全局最优,所以需要记录所有的状态,然后进行处理。

考虑合法的转移状态,注意非法的情况。还有,这题的数据范围很小,100,100的,如果是贪心,那也太小了,所以,一般是dp的可能性很大,最后dp的复杂度是100*100*100,可以在1s的实现内运行完毕。

  1. class Solution {
  2. public:
  3. int findRotateSteps(string ring, string key) {
  4. int n = ring.size();
  5. int m = key.size();
  6. if(n == ) {
  7. return m;
  8. }
  9. vector<vector<int>> dp(m + , vector<int>(n + , -));
  10. dp[][] = ;
  11. for (int i = ; i <= m; i++) {
  12. char cur = key[i - ];
  13. for (int j = ; j < n; j++) {
  14. if(dp[i - ][j] == -) continue;
  15. for (int x = ; x < n; x++) {
  16. if(ring[x] == cur) {
  17. int y = abs(x - j);
  18. if(n - y < y) y = n - y;
  19. if(dp[i][x] == -)
  20. dp[i][x] = dp[i - ][j] + y;
  21. else
  22. dp[i][x] = min(dp[i][x], dp[i - ][j] + y);
  23. }
  24. //cout << j << " " << x << " " << i << " "<< dp[i][x] << endl;
  25. }
  26. }
  27. }
  28. int res = INT_MAX;
  29. for (int i = ; i < n; i++)
  30. if(dp[m][i] != -)
  31. res = min(res, dp[m][i]);
  32. return res + m;
  33. }
  34. };

要求最小值,dp非法值处理的-1的情况,代码写的比较复杂,应该处理成INT_MAX,这样非法情况可以像正常情况一样处理,但是要注意溢出哦,可以取一个很大的数,而不是INT_MAX就行了。

这次题目不是很难,但是我写的还是比较慢!还需要多练!

LeetCode Weekly Contest 22的更多相关文章

  1. LeetCode Weekly Contest 8

    LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...

  2. leetcode weekly contest 43

    leetcode weekly contest 43 leetcode649. Dota2 Senate leetcode649.Dota2 Senate 思路: 模拟规则round by round ...

  3. LeetCode Weekly Contest 23

    LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...

  4. Leetcode Weekly Contest 86

    Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...

  5. LeetCode Weekly Contest

    链接:https://leetcode.com/contest/leetcode-weekly-contest-33/ A.Longest Harmonious Subsequence 思路:hash ...

  6. 【LeetCode Weekly Contest 26 Q4】Split Array with Equal Sum

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/split-array-with-equal-sum/ ...

  7. 【LeetCode Weekly Contest 26 Q3】Friend Circles

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...

  8. 【LeetCode Weekly Contest 26 Q2】Longest Uncommon Subsequence II

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...

  9. 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...

随机推荐

  1. 如何在编辑器打开Java程序

    我们都知道运行JAVA文件,可以从软件控制台运行我们写好的java文件,也可以从windows窗口运行,我们最开始接触的是通过windows窗口来运行java文件,下面简单介绍一下如何如何在编辑器打开 ...

  2. PKCS #1 RSA Encryption Version 1.5 填充方式

    在进行RSA运算时需要将源数据D转化为Encryption block(EB).其中pkcs1padding V1.5的填充模式安装以下方式进行 (1) EB = 00+ BT+PS +00 + D ...

  3. 记录:通过SSH远程连接Ubuntu

    一.安装openssh服务器 $ sudo apt-get install openssh-server 二.启动ssh服务 安装完成后,启动服务: $ sudo /etc/init.d/ssh st ...

  4. 关于jQuery.form中formSerialize()等函数的适用对象

    几个月前写一个页面,要用到Ajax提交,于是写了几行jQuery: …… var formData = $("form")[0].formSerialize(); …… 然后死活调 ...

  5. 【剑指Offer】25、复杂链表的复制

      题目描述:   输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节 ...

  6. POJ 3126 Prime Path (BFS + 素数筛)

    链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...

  7. python-写入csv 文件

    项目要做一个导出客户信息的功能,需要写入csv: 注意文件写入的方式  例如   write open(‘w’) 从头开始写,之前写的会被替换  write open(‘a’) 则代表追加,文件指针放 ...

  8. 解决@vue/cli 创建项目是安装chromedriver时失败的问题

    最近在使用新版vue的命令行工具创建项目时,安装chromedriver老是失败,导致后面的步骤也没有进行.网上搜索了一下,全是使用 工作中常见问题汇总及解决方案 npm install chrome ...

  9. mysql 数据库上传限制

  10. 一篇文档掌握Jdk8中Javascript引擎Nashorn的使用方法

    翻译和编译自: http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/toc.html 用Notepad++新 ...