提交 67dbb640 编写于 作者: W Weikunkun

daily question---20/8/9

上级 81416b34
/* All Contributors (C) 2020 */
package io.github.wkk.everyday.aug;
import io.github.wkk.structs.TreeNode;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* 恢复二叉搜索树
*
* <p>难点: 找出真正出问题的两个点
*
* <p>思路: 根据其性质, 使用中序遍历, 标记出真正出现问题的两个位置, 之后交换其元素值即可
*
* <p>抽象: .....errorOne |increasing sequence | errorTwo .......
*
* <p>第一个节点,是第一个按照中序遍历时候前一个节点大于后一个节点,我们选取前一个节点
*
* <p>第二个节点,是在第一个节点找到之后, 后面出现前一个节点大于后一个节点,我们选择后一个节点
*
* @author kongwiki@163.com
* @since 2020/8/8上午8:59
*/
public class RecoverBinarySearchTree {
private TreeNode errorOne, errorTwo;
public void recoverTree(TreeNode root) {
helper(root);
swap(errorOne, errorTwo);
}
private void helper(TreeNode root) {
if (root == null) {
return;
}
TreeNode pre = null;
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode p = root;
while (!stack.isEmpty() || p != null) {
if (p != null) {
stack.push(p);
p = p.left;
} else {
p = stack.pop();
if (pre != null && pre.val > p.val) {
if (errorOne == null) {
errorOne = pre;
errorTwo = p;
} else {
errorTwo = p;
}
}
pre = p;
p = p.right;
}
}
}
private void swap(TreeNode first, TreeNode second) {
int temp = first.val;
first.val = second.val;
second.val = temp;
}
}
/* All Contributors (C) 2020 */
package io.github.wkk.everyday.aug;
import java.util.ArrayList;
import java.util.List;
/**
* 复原IP地址(IP格式: 每一位都在0-255之间)
*
* <p>思路: 1.暴力求解 2.回溯(涉及到求所有的结果, 常用方法)
*
* @author kongwiki@163.com
* @since 2020/8/9上午9:33
*/
public class RestoreIPAddresses {
/** 暴力求解 需要一个辅助方法, 判断每个子串是否符合IP格式 1. 每位在0-255之间 2. 不能出现0开头的两位以上数字 */
public List<String> restoreIpAddresses(String s) {
List<String> res = new ArrayList<>();
if (s == null || s.length() == 0 || s.length() > 12) {
return res;
}
int n = s.length();
for (int i = 0; i < 3; i++) {
for (int j = i + 1; j < i + 4; j++) {
for (int k = j + 1; k < j + 4; k++) {
if (j < n && k < n) {
String a = s.substring(0, i + 1);
String b = s.substring(i + 1, j + 1);
String c = s.substring(j + 1, k + 1);
String d = s.substring(k + 1);
if (helper(a) && helper(b) && helper(c) && helper(d)) {
StringBuilder sb = new StringBuilder();
sb.append(a)
.append(".")
.append(b)
.append(".")
.append(c)
.append(".")
.append(d);
res.add(sb.toString());
}
}
}
}
}
return res;
}
private boolean helper(String s) {
if (s == null
|| s.length() == 0
|| s.length() > 3
|| s.charAt(0) == '0' && s.length() > 1
|| Integer.parseInt(s) > 255) {
return false;
}
return true;
}
/** 回溯 */
public List<String> restoreIpAddressesII(String s) {
List<String> res = new ArrayList<>();
if (s == null || s.length() == 0 || s.length() > 12) {
return res;
}
int n = s.length();
backtrack(0, "", 4, s, n, res);
return res;
}
/** 回溯本体 */
private void backtrack(int start, String tmp, int flag, String s, int n, List<String> res) {
if (start == n && flag == 0) {
res.add(tmp.substring(0, tmp.length() - 1));
return;
}
if (flag < 0) {
return;
}
for (int j = start; j < start + 3; j++) {
if (j < n) {
if (start == j && s.charAt(j) == '0') {
backtrack(j + 1, tmp + s.charAt(j) + ".", flag - 1, s, n, res);
break;
}
if (Integer.parseInt(s.substring(start, j + 1)) <= 255) {
backtrack(j + 1, tmp + s.substring(start, j + 1) + ".", flag - 1, s, n, res);
}
}
}
}
}
/* All Contributors (C) 2020 */
package io.github.wkk.everyday.aug;
import io.github.wkk.structs.TreeNode;
/**
* @author kongwiki@163.com
* @since 2020/8/7上午8:58
*/
public class SameTree {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
} else {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
}
......@@ -9,7 +9,9 @@
4. [207. 课程表](./everyday/aug/CourseSchedule.java)
5. [337. 打家劫舍III](./everyday/aug/HouseRobberIII.java)
6. [336. 回文对](./everyday/aug/PalindromePairs.java)
7. [100. 相同的树](./everyday/aug/SameTree.java)
8. [99. 恢复二叉搜索树](./everyday/aug/RecoverBinarySearchTree.java)
9. [93. 复原IP地址](./everyday/aug/RestoreIPAddresses.java)
## 哈希表
1. [1. 两数之和](./TwoSum.java)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册