Leetcode Weekly Contest 110

第一题,模拟。思路就是数字和字母的LOG分开,字母的需要排序,我就用TREEMAP来解决了。数字就是原顺序放进ARRAYLIST里。

937. Reorder Log Files

https://leetcode.com/contest/weekly-contest-110/problems/reorder-log-files/

public String[] reorderLogFiles(String[] logs) {
        List<String> num = new ArrayList<>();
        TreeMap<String,Set<String>> letter = new TreeMap<>();
        for (String log : logs) {
            int idx = log.indexOf(' ');
            String iden = log.substring(0,idx);
            String val = log.substring(idx+1);
            if (Character.isDigit(val.charAt(0))) {
                num.add(log);
            }else{
                letter.putIfAbsent(val,new TreeSet<>());
                letter.get(val).add(iden);
            }
        }
        String[] res = new String[logs.length];
        int idx = 0;
        for (String key : letter.keySet()) {
            for (String iden : letter.get(key)) {
                res[idx++] = iden+" "+key;
            }
        }
        for (String digitLog : num) {
            res[idx++] = digitLog;
        }
        return res;
    }

938. Range Sum of BST

https://leetcode.com/contest/weekly-contest-110/problems/range-sum-of-bst/
第二题,是BST搜索,中序遍历,节点符合条件就把值加进去。同时利用BST的性质做优化,来剪枝。

int sum;
    public int rangeSumBST(TreeNode root, int L, int R) {
        if (root == null) 
            return 0;
        inOrder(root, L, R);
        return sum;
    }
    
    private void inOrder(TreeNode cur, int L, int R) {
        if (cur == null)
            return;
        if(cur.val >= L)
            inOrder(cur.left, L, R);
        if (cur.val >= L && cur.val <= R)
            sum += cur.val;
        if(cur.val <= R)
            inOrder(cur.right, L, R);
    }

939. Minimum Area Rectangle

https://leetcode.com/contest/weekly-contest-110/problems/minimum-area-rectangle/
第三题,我卡了一会,我一开始的想法是用扫描线来做。然后遇到点困难。随后看了下数据规模,发现N^2可以,转换思路,用暴力解法。
我们就是找出所有的合法矩形,定义一个矩形需要2个点就够了。一个是左下角的,一个是右上角的。随后看另外2个点在不在点集中,如果在,这就能构成一个合法矩形,枚举左下角和右上角的2个点的选择情况。然后判断矩形存在,存在的话就更新MIN AREA

public int minAreaRect(int[][] points) {
        Set<Integer> s = new HashSet<>();
        for (int[] p : points) {
            s.add(p[0] * 40001 + p[1]);
        }
        int min = Integer.MAX_VALUE;
        int l = points.length;
        for (int i = 0; i < l; i++) {
            int[] p1 = points[i];
            for (int j = i + 1; j < l; j++) {
                int[] p2 = points[j];
                if (p1[0] == p2[0] || p1[1] == p2[1]) continue;
                int need1 = p1[0] * 40001 + p2[1];
                int need2 = p2[0] * 40001 + p1[1];
                if (s.contains(need1) && s.contains(need2)) {
                   min = Math.min(Math.abs(p1[0]-p2[0]) * Math.abs(p1[1]-p2[1]), min); 
                }
            }
        }
        
        return min == Integer.MAX_VALUE ? 0 : min;
            
    }

940. Distinct Subsequences II

https://leetcode.com/contest/weekly-contest-110/problems/distinct-subsequences-ii/
这道题,我上来就思考到。如果新进来一个从没见过的字母。其实就是2*pre + 1
因为除了前面部分产生的答案,随后产生的答案都可以在前面的答案基础上加上那个新字母而不会有重复。
最后+1 是因为,唯一这个新字母,也是一个答案。
但是再遇到了前面出现过这个字母的时候,遇到了困难。
随后我通过举例ABB, ABA
发现可以通过增加一个空字符串来定义当遇到一个重复字母的转移方程。
DP[0] = 1
我们开一个DP数组,表示的含义是DP I = 第I个字母作为结尾,可以贡献多少个新的子序列。
如果这个字母之前从未出现过。那么DP I = SUM{DP[0] - > DP[I-1]}
举例 "", a ,b
dp 1, 1(a), 2(b,ab)
那么再来一个B 的时候,观察发现。因为之前一些字符更短的,已经被前面的B COVER过了。所以新来的B,只能在从B开始之后构造的子序列里加上自己。

如果来的是C(一个新字符),那么可以用C 去和“” 组合,去和 a (a) 组合, 去和b (b,ab) 组合。
变成 c,ac,bc,abc
当来的是B, 那么和a 和 “”组合,会和之前的B有重复。 所以只能和B 组合。
变成 bb,abb
那么在观察aba 的时候,
a遇到了前面那个a,前面那个a 占用了和空串 组合,所以新来的A,没有必要再和前面那个A的前面的任何子串做组合了,因为都会和前面那个A组合有重复。
根据以上。

public int distinctSubseqII(String S) {
        if(S.length() == 0) return 0;
        int[] dp = new int[S.length()+1];
        dp[0] = 1;
        int M = 1000000007;
        for (int i = 1; i <= S.length(); i++) {
            long sum = 0;
            for (int j = i - 1; j >= 0; j--) {
                sum += dp[j];
                if(j == 0 || S.charAt(i - 1) == S.charAt(j - 1))
                    break;
            }
            dp[i] = (int) (sum % M);
        }
        int res = 0;
        for(int i = 1; i <= S.length(); i++) {
            res = (res + dp[i]) % M;
        }
        return res;
    }

最后求和这部,可以利用前缀和的思想,来优化掉。
但是我们要找到最近的那个相同字母的出现位置,后面的都要减去。
所以要额外开一个26的数组(等价MAP)来记录最后该字母在STR中出现的位置即可。

public int distinctSubseqII(String S) {
        if(S.length() == 0) return 0;
        int[] dp = new int[S.length()+1];
        dp[0] = 1;
        int[] pos = new int[26];
        Arrays.fill(pos, -1);
        int M = 1000000007;
        for (int i = 1; i <= S.length(); i++) {
            dp[i] = 2 * dp[i - 1] % M;
            int idx = S.charAt(i - 1) - 'a';
            if(pos[idx] != -1) {
                dp[i] = (dp[i] - dp[pos[idx] - 1] + M) % M;
            }
            pos[idx] = i;
        }
        return dp[S.length()] - 1;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,723评论 0 33
  • 这次比赛,网站挂了10多分钟。后来终于进去了。我做出来3道,最后一道知道是DP,最后一步没当场分析出来。最后排名1...
    西部小笼包阅读 591评论 0 1
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 3,051评论 0 0
  • 因为那次比赛,人在外面旅游,来补发一下104的4道题。 914. X of a Kind in a Deck of...
    西部小笼包阅读 382评论 0 0
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,970评论 0 13