LeetCode weekly contest 190 周赛

5/23/20
第二次打周赛。全部通过AC。纪念一下。最后一题DP用的不是最优解,写了2次bug version。
可以去Github直接看我其他leetcode代码。

  1. Q1455_Check If a Word Occurs As a Prefix of Any Word in a Sentence
class Solution {
    public int isPrefixOfWord(String sentence, String searchWord) {
        sentence = sentence.trim();
        if (sentence.isEmpty())
            return -1;
        String[] arr = sentence.split("\\s+");
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].indexOf(searchWord) == 0)
                return i+1;
        }
        return -1;
    }
}
  1. Q1456_Maximum Number of Vowels in a Substring of Given Length
class Solution {
    public int maxVowels(String s, int k) {
        int n = s.length();
        boolean[] isVow = new boolean[n];
        int res = 0;
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == 'a' ||
               s.charAt(i) == 'e' ||
               s.charAt(i) == 'i' ||
               s.charAt(i) == 'o' ||
               s.charAt(i) == 'u')
                isVow[i] = true;
            if (i < k && isVow[i]) 
                res++;
        }
        if (n < k)
            return res;
        int[] cnt = new int[n-k+1];
        cnt[0] = res;
        for (int i = 1; i < n-k+1; i++) {
            cnt[i] = cnt[i-1];
            if (isVow[i-1])
                cnt[i]--;
            if (isVow[i+k-1])
                cnt[i]++;
            if (cnt[i] > res)
                res = cnt[i];
        }
        return res;
    }
}
  1. Q1457_Pseudo-Palindromic Paths in a Binary Tree
class Solution {
    int res = 0;
    public int pseudoPalindromicPaths (TreeNode root) {
        preOrder(root, new int[10]);
        return res;
    }
    
    private void preOrder(TreeNode root, int[] cnt) {
        if (root == null)
            return;
        int val = root.val;
        cnt[val]++;
        if (root.left == null && root.right == null) {
            if (valid(cnt))
                res++;
            cnt[val]--;
            return;
        }
        preOrder(root.left, cnt);
        preOrder(root.right, cnt);
        cnt[val]--;
    }
    
    private boolean valid(int[] cnt) {
        int odd = 0;
        for (int i = 1; i <= 9; i++) {
            if (cnt[i] % 2 == 1)
                odd++;
            if (odd >= 2)
                return false;
        }
        return true;
    }
}
  1. Q1458_Max Dot Product of Two Subsequences
class Solution {
    public int maxDotProduct(int[] nums1, int[] nums2) {
        int res = Integer.MIN_VALUE;
        int m = nums1.length;
        int n = nums2.length;
        int[][] prod = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                prod[i][j] = nums1[i] * nums2[j];
            }
        }
        int len = Math.min(m, n);
        // first i elements in nums1, first j elements in nums2, used elements: k
        int[][][] dp = new int[m+1][n+1][len+1];
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
                for (int k = 1; k <= len; k++)
                    dp[i][j][k] = Integer.MIN_VALUE;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                for (int k = 1; k <= Math.min(i,j); k++) {
                    if (i > 1) 
                        dp[i][j][k] = Math.max(dp[i][j][k], dp[i-1][j][k]);
                    if (j > 1) 
                        dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j-1][k]);
                    dp[i][j][k] = Math.max(dp[i][j][k], dp[i-1][j-1][k-1] + prod[i-1][j-1]);
                }
            }
        }
        for (int k = 1; k <= len; k++)
            res = Math.max(res, dp[m][n][k]);
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40136685/article/details/106313189
今日推荐