leecode,rt_phm更新更新

This commit is contained in:
kevinding1125 2023-05-30 19:34:16 +08:00
parent af7485f4af
commit db735dbbc3
4 changed files with 284 additions and 1 deletions

View File

@ -2,6 +2,7 @@ package com.markilue.leecode.hot100.interviewHot.union_find;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
/**
@ -14,9 +15,105 @@ import java.util.Arrays;
*/
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;
}
/**
* 删除一条边之后判断是不是树
* @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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}