zoukankan      html  css  js  c++  java
  • Contest 141

    2019-06-16 14:35:52

    • 1089. Duplicate Zeros - Easy

    问题描述:

    问题求解:

    很显然的可以使用O(n), O(n)的解法。主要问题在于如何在O(1)空间复杂度完成求解。

    答案就是通过两次遍历,第一次求出复制后的数组的长度,第二次遍历填写数组。

        public void duplicateZeros(int[] arr) {
            if (arr.length == 1) return;
            final int n = arr.length;
            int newLen = 0;
            for (int i = 0; i < n; i++) {
                if (arr[i] == 0) newLen++;
                newLen++;
            }
            for (int i = n - 1; i >= 0; i--) {
                if (--newLen < n) arr[newLen] = arr[i];
                if (arr[i] == 0 && --newLen < n) arr[newLen] = 0;
            }
        }
    

      

    • 1090. Largest Values From Labels - Medium

    问题描述:

    问题求解:

    本题要求的是挑选至多num_wanted个数的物品,并且每个物品不能超过limit的数目。

    显然的是,可以根据价值来贪心的选取,问题就是如何不超过limit的数目,也就是将value和label建立联系。这个建立联系的方式是需要经验的,这里采用的是组pair的方式建立联系,事实上,很多时候这种建立pair的方式是最行之有效的,可以特别关注一下。

        public int largestValsFromLabels(int[] values, int[] labels, int num_wanted, int use_limit) {
            List<int[]> pairs = new ArrayList<>();
            Map<Integer, Integer> map = new HashMap<>();
            final int n = values.length;
            for (int i = 0; i < n; i++) {
                if (!map.containsKey(labels[i])) map.put(labels[i], 0);
                pairs.add(new int[]{values[i], labels[i]});
            }
            PriorityQueue<int[]> pq = new PriorityQueue<>((int[] o1, int[] o2) -> o2[0] - o1[0]);
            pq.addAll(pairs);
            int res = 0;
            for (int i = 0; i < num_wanted && !pq.isEmpty();) {
                int[] curPair = pq.poll();
                if (map.get(curPair[1]) < use_limit) {
                    res += curPair[0];
                    map.put(curPair[1], map.get(curPair[1]) + 1);
                    i++;
                }
            }
            return res;
        }
    

      

    • 1091. Shortest Path in Binary Matrix - Medium

    问题描述:

    问题求解:

    裸的BFS。

        public int shortestPathBinaryMatrix(int[][] grid) {
            if (grid.length == 0 || grid[0].length == 0) return -1;
            final int n = grid.length;
            final int[][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
            if (grid[0][0] != 0 || grid[n - 1][n - 1] != 0) return -1;
            Queue<int[]> q = new LinkedList<>();
            q.add(new int[]{0, 0});
            grid[0][0] = 2;
            int step = 0;
            while (!q.isEmpty()) {
                int size = q.size();
                step++;
                for (int i = 0; i < size; i++) {
                    int[] curNode = q.poll();
                    for (int[] dir : dirs) {
                        int x = curNode[0] + dir[0];
                        int y = curNode[1] + dir[1];
                        if (x < 0 || x >= n || y < 0 || y >= n || grid[x][y] != 0) continue;
                        if (x == n - 1 && y == n - 1) return step + 1;
                        q.add(new int[]{x, y});
                        grid[x][y] = 2;
                    }
                }
            }
            return -1;
        }
    

     

    • 1092. Shortest Common Supersequence - Hard

    问题描述:

    问题求解:

    问题需要的是最短的supersequence,那么就是需要将两个字符串拼接后能够最大限度的去除重复的字符,因此本题就变为了求最长公共子序列的问题,并且需要构造出最长公共子序列。

    这里直接暴力的进行构造。

        public String shortestCommonSupersequence(String s1, String s2) {
            if (s1.length() == 0) return s2;
            if (s2.length() == 0) return s1;
            int m = s1.length();
            int n = s2.length();
            String common = lcs(s1, s2);
            System.out.println(common);
            StringBuffer sb = new StringBuffer();
            int i = 0; 
            int j = 0;
            for (char c : common.toCharArray()) {
                while (i < m && s1.charAt(i) != c) {
                    sb.append(s1.charAt(i));
                    i++;
                }
                while (j < n && s2.charAt(j) != c) {
                    sb.append(s2.charAt(j));
                    j++;
                }
                sb.append(c);
                i++;
                j++;
            }
            while (i < m) sb.append(s1.charAt(i++));
            while (j < n) sb.append(s2.charAt(j++));
            return sb.toString();
        }
    
        private String lcs(String s1, String s2) {
            int m = s1.length();
            int n = s2.length();
            String[][] dp = new String[m + 1][n + 1];
            for (int j = 0; j <= n; j++) dp[0][j] = "";
            for (int i = 0; i <= m; i++) dp[i][0] = "";
            for (int i = 1; i <= m; i++) {
                for (int j = 1; j <= n; j++) {
                    if (s1.charAt(i - 1) == s2.charAt(j - 1)) dp[i][j] = dp[i - 1][j - 1] + s1.charAt(i - 1);
                    else if (dp[i - 1][j].length() > dp[i][j - 1].length()) dp[i][j] = dp[i - 1][j];
                    else dp[i][j] = dp[i][j - 1];
                }
            }
            return dp[m][n];
        }
    

      

     

  • 相关阅读:
    Java 线程间通信 —— 等待 / 通知机制
    Java 线程基础
    Java 内存模型
    Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制、原子操作
    优秀程序员的博客有哪些?
    程序员五一被拉去相亲,结果彻底搞懂了HTTP常用状态码
    【Redis破障之路】三:Redis单线程架构
    【Redis破障之路】一:强大的Redis
    MySQL提升笔记(4)InnoDB存储结构
    MySQL提升笔记(3)日志文件详解
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/11031758.html
Copyright © 2011-2022 走看看