leecode,rt_phm更新更新
This commit is contained in:
parent
af7485f4af
commit
db735dbbc3
|
|
@ -2,6 +2,7 @@ package com.markilue.leecode.hot100.interviewHot.union_find;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -14,9 +15,105 @@ import java.util.Arrays;
|
||||||
*/
|
*/
|
||||||
public class LC_685_FindRedundantConnection {
|
public class LC_685_FindRedundantConnection {
|
||||||
|
|
||||||
public int[] findRedundantDirectedConnection(int[][] edges) {
|
int[] father;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
private void init(int[] father) {
|
||||||
|
for (int i = 0; i < father.length; i++) {
|
||||||
|
father[i] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int find(int u) {
|
||||||
|
if (father[u] == u) {
|
||||||
|
return u;
|
||||||
|
}
|
||||||
|
father[u] = find(father[u]);
|
||||||
|
return father[u];
|
||||||
|
}
|
||||||
|
|
||||||
|
private void join(int u, int v) {
|
||||||
|
u = find(u);
|
||||||
|
v = find(v);
|
||||||
|
if (u == v) return;
|
||||||
|
father[v] = u;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean same(int u, int v) {
|
||||||
|
u = find(u);
|
||||||
|
v = find(v);
|
||||||
|
return u == v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在有向图里找到需要删除的那条边,删除之后会变为树结构
|
||||||
|
* @param edges
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int[] getRemoveEdge(int[][] edges) {
|
||||||
|
init(father);
|
||||||
|
for (int[] edge : edges) {
|
||||||
|
if (same(edge[0], edge[1])) {
|
||||||
|
return edge;//有连接的
|
||||||
|
}
|
||||||
|
join(edge[0], edge[1]);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除一条边之后判断是不是树
|
||||||
|
* @param edges
|
||||||
|
* @param deleteEdge 要删除的边
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean isTreeAfterRemoveEdge(int[][] edges, int deleteEdge) {
|
||||||
|
init(father);
|
||||||
|
for (int i = 0; i < edges.length; i++) {
|
||||||
|
//跳过删除的边,判断是否为树
|
||||||
|
if (deleteEdge == i) continue;
|
||||||
|
if (same(edges[i][0], edges[i][1])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
join(edges[i][0], edges[i][1]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int[] findRedundantDirectedConnection(int[][] edges) {
|
||||||
|
n = 1010;
|
||||||
|
father = new int[n];
|
||||||
|
init(father);
|
||||||
|
//判断图的入度
|
||||||
|
int[] oneDegree = new int[n];
|
||||||
|
for (int[] edge : edges) {
|
||||||
|
oneDegree[edge[1]]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 找入度为2的节点所对应的边,注意要倒序,因为优先返回最后出现在二维数组中的答案
|
||||||
|
ArrayList<Integer> twoDegree = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = edges.length - 1; i >= 0; i--) {
|
||||||
|
if (oneDegree[edges[i][1]] == 2) {
|
||||||
|
twoDegree.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 处理图中情况1 和 情况2
|
||||||
|
// 如果有入度为2的节点,那么一定是两条边里删一个,看删哪个可以构成树
|
||||||
|
if (!twoDegree.isEmpty()) {
|
||||||
|
if (isTreeAfterRemoveEdge(edges, twoDegree.get(0))) {
|
||||||
|
return edges[twoDegree.get(0)];
|
||||||
|
}
|
||||||
|
return edges[twoDegree.get(1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return getRemoveEdge(edges);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
package com.markilue.leecode.hot100.second;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@BelongsProject: Leecode
|
||||||
|
*@BelongsPackage: com.markilue.leecode.hot100.second
|
||||||
|
*@Author: markilue
|
||||||
|
*@CreateTime: 2023-05-30 17:15
|
||||||
|
*@Description: TODO 力扣283 移动零:
|
||||||
|
*@Version: 1.0
|
||||||
|
*/
|
||||||
|
public class T75_283_MoveZeroes {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {0, 1, 0, 3, 12};
|
||||||
|
moveZeroes(nums);
|
||||||
|
System.out.println(Arrays.toString(nums));
|
||||||
|
}
|
||||||
|
|
||||||
|
//插入排序
|
||||||
|
public void moveZeroes(int[] nums) {
|
||||||
|
|
||||||
|
for (int i = nums.length - 1; i >= 0; i--) {
|
||||||
|
if (nums[i] == 0) {
|
||||||
|
//需要更换位置
|
||||||
|
int j = i;
|
||||||
|
while (j < nums.length - 1 && nums[j + 1] != 0) {
|
||||||
|
nums[j] = nums[j + 1];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
nums[j] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//双指针
|
||||||
|
public void moveZeroes1(int[] nums) {
|
||||||
|
int left = 0;
|
||||||
|
int right = 0;//寻找不是0的 注意是从0开始不是从length开始
|
||||||
|
while (right < nums.length) {
|
||||||
|
if (nums[right] != 0) {
|
||||||
|
swap(nums, left, right);
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
right++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void swap(int[] nums, int left, int right) {
|
||||||
|
int temp = nums[left];
|
||||||
|
nums[left] = nums[right];
|
||||||
|
nums[right] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.markilue.leecode.hot100.second;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@BelongsProject: Leecode
|
||||||
|
*@BelongsPackage: com.markilue.leecode.hot100.second
|
||||||
|
*@Author: markilue
|
||||||
|
*@CreateTime: 2023-05-30 17:46
|
||||||
|
*@Description: TODO 力扣287 寻找重复数
|
||||||
|
*@Version: 1.0
|
||||||
|
*/
|
||||||
|
public class T76_287_FindDuplicate {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {1, 3, 4, 2, 2};
|
||||||
|
System.out.println(findDuplicate(nums));
|
||||||
|
}
|
||||||
|
|
||||||
|
//改变数组
|
||||||
|
public int findDuplicate(int[] nums) {
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
nums[nums[i] % nums.length] += nums.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if (nums[i] / nums.length > 1) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
package com.markilue.leecode.hot100.second;
|
||||||
|
|
||||||
|
import com.markilue.leecode.tree.TreeNode;
|
||||||
|
import com.markilue.leecode.tree.TreeUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@BelongsProject: Leecode
|
||||||
|
*@BelongsPackage: com.markilue.leecode.hot100.second
|
||||||
|
*@Author: markilue
|
||||||
|
*@CreateTime: 2023-05-30 17:58
|
||||||
|
*@Description: TODO 力扣297 二叉树的序列化与反序列化
|
||||||
|
*@Version: 1.0
|
||||||
|
*/
|
||||||
|
public class T77_297_Codec {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
List<Integer> nodeList = new ArrayList<>(Arrays.asList(1, 2, 3, null, null, 4, 5));
|
||||||
|
TreeNode root = TreeUtils.structureTree(nodeList, 0);
|
||||||
|
System.out.println(serialize(root));
|
||||||
|
TreeNode next = deserialize(serialize(root));
|
||||||
|
TreeUtils.printTreeByLevel(next);
|
||||||
|
// System.out.println(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Encodes a tree to a single string.
|
||||||
|
public String serialize(TreeNode root) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
serialize(root, sb);
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void serialize(TreeNode node, StringBuilder sb) {
|
||||||
|
if (node == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sb.append(node.val);
|
||||||
|
if (node.left != null) {
|
||||||
|
sb.append("(");
|
||||||
|
serialize(node.left, sb);
|
||||||
|
sb.append(")");
|
||||||
|
}
|
||||||
|
if (node.right != null) {
|
||||||
|
if (node.left == null) {
|
||||||
|
sb.append("()");
|
||||||
|
}
|
||||||
|
sb.append("(");
|
||||||
|
serialize(node.right, sb);
|
||||||
|
sb.append(")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int in = 0;
|
||||||
|
|
||||||
|
// Decodes your encoded data to tree.
|
||||||
|
public TreeNode deserialize(String data) {
|
||||||
|
if (in >= data.length() || data.charAt(in) == ')') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
TreeNode root = new TreeNode();
|
||||||
|
int multi = 1;
|
||||||
|
if (data.charAt(in) == '-') {
|
||||||
|
multi = -1;
|
||||||
|
in++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (in < data.length() && data.charAt(in) >= '0' && data.charAt(in) <= '9') {
|
||||||
|
root.val = root.val * 10 + data.charAt(in)-'0';
|
||||||
|
in++;
|
||||||
|
}
|
||||||
|
root.val *= multi;
|
||||||
|
if(in<data.length()&&data.charAt(in)=='('){
|
||||||
|
in++;//左括号
|
||||||
|
root.left = deserialize(data);
|
||||||
|
in++;//右括号
|
||||||
|
}
|
||||||
|
|
||||||
|
if(in<data.length()&&data.charAt(in)=='('){
|
||||||
|
in++;//左括号
|
||||||
|
root.right = deserialize(data);
|
||||||
|
in++;//右括号
|
||||||
|
}
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue