【 NO.1 能够输出的最大单词数】
解题思路
签到题,循环遍历判断即可。
代码展现
class Solution {
public int canBeTypedWords(String text, String brokenLetters) { if (text == null || text.length() == 0) { return 0; } String[] texts = text.split(" "); Set<Character> set = new HashSet<>(); for (char c : brokenLetters.toCharArray()) { set.add(c); } int ans = 0, flag = 0; for (String word : texts) { for (char c : word.toCharArray()) { if (set.contains(c)) { flag = 1; break; } } if (flag == 0) { ans++; } flag = 0; } return ans;}
}
【 NO.2 新增的起码台阶数】
解题思路
第二道签到题,两两计算差值,须要判断一下是否能够整除。
代码展现
class Solution {
public int addRungs(int[] rungs, int dist) { if (rungs == null || rungs.length == 0) { return 0; } int ans = 0; int preRun = 0; for (int rung : rungs) { int diff = rung - preRun; // 整除的状况可梯子少一个 if (diff % dist == 0) { ans += diff / dist - 1; } else { ans += diff / dist; } preRun = rung; } return ans;}
}
【 NO.3 扣分后的最大得分】
解题思路
坐标型动静布局
dpi示意处于坐标 i j 的地位的最大收益
一般的坐标转化会超时
思考针对每一个j,会从 j的左侧和右侧转移过去,咱们只想要一个收益最大的
因而在遍历 j 的时候记录这个左侧和右侧最大的收益,给下一层用
还有优化的空间,i 能够压缩成两行
代码展现
class Solution {
public long maxPoints(int[][] points) { if (points == null || points.length == 0 || points[0].length == 0) { return 0; } int n = points.length; int m = points[0].length; long[][] dp = new long[n][m]; // 首行初始化 for (int j = 0; j < m; j++) { dp[0][j] = points[0][j]; } for (int i = 1; i < n; i++) { // 对于所有上一行右边的数,都是加上它的坐标减去本人的坐标; // 对于上一行所有左边的数,都是减去它的坐标加上本人的坐标; long leftMax = Integer.MIN_VALUE; long rightMax = Integer.MIN_VALUE; for (int j = 0; j < m; j++) { leftMax = Math.max(leftMax, dp[i - 1][j] + j); rightMax = Math.max(rightMax, dp[i - 1][m - 1 - j] - (m - 1 - j)); dp[i][j] = Math.max(dp[i][j], points[i][j] + leftMax - j); dp[i][m - 1 - j] = Math.max(dp[i][m - 1 - j], points[i][m - 1 - j] + rightMax + m - 1 - j); } } long ans = 0; for (int j = 0; j < m; j++) { ans = Math.max(ans, dp[n - 1][j]); } return ans;}
}
【 NO.4 查问最大基因差】
解题思路
二进制的字典树:将数字转化成二进制记录在字典树当中
构建树,不便做DFS
每搜寻一个数字,将该数字更新到字典树当中
在字典树上计算最终最大的异或值
代码展现
class Trie {
Trie left; // 1Trie right; // 0int[] count = new int[2];public Trie() {}// s == 1 增加, s == -1 删除public void insert(int val, int s) { int flag = (1 << 30); Trie node = this; while (flag > 0) { int bit = (flag & val); if (bit > 0) { // 1 走右边 if (node.left == null) { node.left = new Trie(); } node.count[1] += s; node = node.left; } else { // 0 走左边 if (node.right == null) { node.right = new Trie(); } node.count[0] += s; node = node.right; } flag >>>= 1; }}public int getMax(int val) { Trie node = this; int flag = (1 << 30); int res = 0; while (flag > 0) { int bit = (flag & val); // 贪婪算法,1 的话走左边,0 的话走右边 if (bit > 0) { // 走左边,左边不行走右边 if (node.right != null && node.count[0] > 0 ) { node = node.right; res |= flag; } else if (node.left != null && node.count[1] > 0) { node = node.left; } else { return -1; } } else { // 优先走右边 if (node.left != null && node.count[1] > 0) { node = node.left; res |= flag; } else if (node.right != null && node.count[0] > 0) { node = node.right; } else { return -1; } } flag >>>= 1; } return res;}
}
public class Solution2 {
static class TreeNode { List<TreeNode> son = new ArrayList<>(); int val; public TreeNode(int val) { this.val = val; }}Map<Integer, List<int[]>> map = new HashMap<>();Trie trie;public int[] maxGeneticDifference(int[] parents, int[][] queries) { int n = parents.length, m = queries.length; // 封装查问的信息 for (int i = 0; i < m; i++) { int node = queries[i][0], val = queries[i][1]; if (!map.containsKey(node)) { map.put(node, new ArrayList<>()); } map.get(node).add(new int[]{val, i}); } Map<Integer, TreeNode> nodeMap = new HashMap<>(); // 构建树 TreeNode root = null; for (int i = 0; i < parents.length; i++) { int p = parents[i]; if (!nodeMap.containsKey(i)) { nodeMap.put(i, new TreeNode(i)); } if (p != -1) { if (!nodeMap.containsKey(p)) { nodeMap.put(p, new TreeNode(p)); } nodeMap.get(p).son.add(nodeMap.get(i)); } else { root = nodeMap.get(i); } } trie = new Trie(); int[] res = new int[m]; // 在树上进行DFS dfs(root, res, map, trie); return res;}private void dfs(TreeNode root, int[] res, Map<Integer, List<int[]>> map, Trie t) { if (root == null) { return; } t.insert(root.val, 1); if (map.containsKey(root.val)) { for (int[] each : map.get(root.val)) { int idx = each[1], v = each[0]; res[idx] = t.getMax(v); } } for (TreeNode s : root.son) { dfs(s, res, map, t); } // delete t.insert(root.val, -1);}
}
关注咱们
杭州上岸算法网络科技有限公司