zoukankan      html  css  js  c++  java
  • LeetCode Weekly Contest 12

    1. 第一题

    看完题目后,肯定先对houses和heaters排序,然后考虑贪心可以么,我那时候没有想出来,然后看到可以O(n)的判断一个半径是否满足要求,就对半径[0,1e9]进行二分,然后就a了。

    其实,排完序可以进行贪心,对每一个houses,找到最近的heaters,左右2边的,求最小,这个可以通过二分来做,然后不断更新结果,求出最小值的最大值,这应该算是正常的解法。

    我认为应该算是medium,easy难度设的有点低。

    2. 第二题

    字符串题目,其实看到这题,我是不大乐意的,因为这题需要考虑各种边界条件,而我写出的代码也是比较丑的。

    这题没有什么套路,直接考虑说明中各种边界条件就可以了。

    3.第三题

    找了例子写了一下,发现贪心不行,因为不知道0和1,应该尽可能的使用哪一个,然后统计个数,忽略每个字符串01的顺序,然后考虑dp。就是每个每个字符串选还是不选,结果的最大值,简单的背包问题。

    注意从大到小更新,搞清楚转移方程。

    4.第四题

    一看题目,完全懵逼,根本无从下手。我一般先做可以出结果的题目,这次的先做2,3题,看到第四题,感觉不行,就写1题,写完再看了看第四题,就直接放弃了。

    题解看的这里:

    http://bookshadow.com/weblog/2016/12/11/leetcode-encode-string-with-shortest-length/

    分析的很棒,我不知道怎么分析复杂度。看题目的时候,长度只有160,发现n^2的复杂度也不会超时,但是没思路。

    想起来,跟 411 Minimum Unique Word Abbreviation 差不多。

    根据上面的题解,写的代码。

     1 class Solution {
     2 public:
     3     map<string, string> ma;
     4     //string encode(string s);
     5     string work(string s) {
     6         string res = s;
     7         int n = s.size();
     8         for (int i = 1; i <= n / 2; i++) {
     9             bool f = 1;
    10             if(n % i != 0) continue;
    11             for (int j = 0; j < s.size(); j++) {
    12                 if(s[j] != s[j % i]) {
    13                     f = 0;
    14                     break;
    15                 }
    16             }
    17             if(f) {
    18                 stringstream s1;
    19                 s1 << n / i << '[' << encode(s.substr(0, i)) << ']';
    20                 string t = s1.str();
    21                 if(t.size() < res.size()) res = t;
    22             }
    23         }
    24         return res;
    25     }
    26     string encode(string s) {
    27         int n = s.size();
    28         if(n <= 1) return s;
    29         if(ma.count(s)) return ma[s];
    30         string res = s;
    31         for (int i = 1; i <= s.size(); i++) {
    32             string left = s.substr(0, i), right = s.substr(i);
    33             string t = work(left) + encode(right);
    34             if(res.size() > t.size()) res = t;
    35         }
    36         return ma[s] = res;
    37     }
    38 };

     其实可以写一下当初为什么没有想法,或者是有一点想法,不知道怎么下手,或者有什么疑问。

    问题一:怎么处理循环几次的问题,不知道怎么考虑,要用什么后缀树,前缀树处理么?其实,这个过程是要通过枚举来处理,枚举切分长度,然后判读是否是这个长度的的重复串。真的,这个问题之前真的不知道怎么处理!

    问题二:中括号里面的编码怎么处理,其实这里猜也可以猜到:递归调用encode

    问题三:怎么处理需要编码和不需要编码的部分,就是上面代码的33行的处理部分,这个怎么分析出来的。

    问题四:上面这样搞的复杂度是多少,1s的时限内是否可以运行完毕,这些都是需要考虑的!

    反正,就上面这么多疑问,下次遇到类似的问题的时候,应该知道怎么下手吧!

  • 相关阅读:
    NOIP 2016 回文日期
    USACO Ski Course Design
    USACO Combination Lock
    USACO 利润Profits
    POJ 3368 Frequent values
    USACO Balanced Lineup
    JDOJ 1065 打倒苏联修正主义
    JDOJ 2174 忠诚
    VIJOS-P1514 天才的记忆
    VIJOS-P1423 最佳路线
  • 原文地址:https://www.cnblogs.com/y119777/p/6164747.html
Copyright © 2011-2022 走看看