leecode更新
This commit is contained in:
parent
cb04a53dbc
commit
a4334c4a16
|
|
@ -0,0 +1,107 @@
|
||||||
|
package com.markilue.leecode.hot100;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@BelongsProject: Leecode
|
||||||
|
*@BelongsPackage: com.markilue.leecode.hot100
|
||||||
|
*@Author: markilue
|
||||||
|
*@CreateTime: 2023-03-19 11:05
|
||||||
|
*@Description:
|
||||||
|
* TODO 力扣283题 移动零:
|
||||||
|
* 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
|
||||||
|
* 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
|
||||||
|
*@Version: 1.0
|
||||||
|
*/
|
||||||
|
public class T75_MoveZeroes {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {0, 1, 0, 3, 12};
|
||||||
|
moveZeroes1(nums);
|
||||||
|
System.out.println(Arrays.toString(nums));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test1() {
|
||||||
|
int[] nums = {1, 0, 1};
|
||||||
|
moveZeroes(nums);
|
||||||
|
System.out.println(Arrays.toString(nums));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 思路:双指针
|
||||||
|
* 速度击败32.68% 内存击败25.8% 2ms
|
||||||
|
* @param nums
|
||||||
|
*/
|
||||||
|
public void moveZeroes(int[] nums) {
|
||||||
|
|
||||||
|
int left = 0;//找零的
|
||||||
|
int right = 0;//找不是零的
|
||||||
|
|
||||||
|
while (left < nums.length && right < nums.length) {
|
||||||
|
while (left < nums.length && nums[left] != 0) {
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (right < nums.length && nums[right] == 0) {
|
||||||
|
right++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (right < nums.length && left < right) {
|
||||||
|
swap(nums, left, right);
|
||||||
|
} else if (left > right) {
|
||||||
|
right = left + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void swap(int[] nums, int left, int right) {
|
||||||
|
int temp = nums[left];
|
||||||
|
nums[left] = nums[right];
|
||||||
|
nums[right] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 官方解答:
|
||||||
|
* 速度击败32.68% 内存击败72.91% 2ms
|
||||||
|
* @param nums
|
||||||
|
*/
|
||||||
|
public void moveZeroes1(int[] nums) {
|
||||||
|
int n = nums.length, left = 0, right = 0;
|
||||||
|
while (right < n) {
|
||||||
|
if (nums[right] != 0) {
|
||||||
|
swap(nums, left, right);
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
right++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 官方最快:直接赋值,不用交换
|
||||||
|
* 速度击败100% 内存击败24.58% 1ms
|
||||||
|
* @param nums
|
||||||
|
*/
|
||||||
|
public void moveZeroes2(int[] nums) {
|
||||||
|
int index=0;
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if(nums[i]!=0){
|
||||||
|
nums[index++]=nums[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//index后面的全是0
|
||||||
|
for (int i =index; i <nums.length ; i++) {
|
||||||
|
nums[i]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
package com.markilue.leecode.hot100;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@BelongsProject: Leecode
|
||||||
|
*@BelongsPackage: com.markilue.leecode.hot100
|
||||||
|
*@Author: markilue
|
||||||
|
*@CreateTime: 2023-03-19 11:32
|
||||||
|
*@Description:
|
||||||
|
* TODO 力扣287 寻找重复数:
|
||||||
|
* 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
|
||||||
|
* 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
|
||||||
|
* 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
|
||||||
|
*@Version: 1.0
|
||||||
|
*/
|
||||||
|
public class T76_FindDuplicate {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {1, 3, 4, 2, 2};
|
||||||
|
System.out.println(findDuplicate2(nums));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 因为数字都在1-n之间,所以总和是一定的
|
||||||
|
* 使用总和减去现在的总和,就可以知道差值
|
||||||
|
* 不对:一个整数不是一定出现两次,可能出现多次
|
||||||
|
* @param nums
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int findDuplicate(int[] nums) {
|
||||||
|
|
||||||
|
int totalSum = 0;
|
||||||
|
int curSum = 0;
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
totalSum += (i + 1);
|
||||||
|
curSum += nums[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return nums.length - (totalSum - curSum);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 官方二分查找法:注意这里是mid,不是nums[mid],奇特的地方就在于,如果一个数有重复的数的话,那么小于这个数的count一定>它本身
|
||||||
|
* 时间复杂度O(nlogn)
|
||||||
|
* 速度击败15.73% 内存击败39.73% 28ms
|
||||||
|
* @param nums
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int findDuplicate1(int[] nums) {
|
||||||
|
|
||||||
|
int n = nums.length;
|
||||||
|
int l = 1, r = n - 1, ans = -1;
|
||||||
|
while (l <= r) {
|
||||||
|
int mid = (l + r) >> 1;
|
||||||
|
int cnt = 0;
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
if (nums[i] <= mid) {
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cnt <= mid) {
|
||||||
|
l = mid + 1;
|
||||||
|
} else {
|
||||||
|
r = mid - 1;
|
||||||
|
ans = mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 快慢指针: 类似于监测环
|
||||||
|
* 如果有重复,那么一定会成环,有环则一定会来回跳直至相遇
|
||||||
|
* 时间复杂度O(N)
|
||||||
|
* 速度击败92.87% 内存击败67.52% 4ms
|
||||||
|
* @param nums
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int findDuplicate2(int[] nums) {
|
||||||
|
int slow = 0, fast = 0;
|
||||||
|
do {
|
||||||
|
slow = nums[slow];//走一步
|
||||||
|
fast = nums[nums[fast]];//走两步
|
||||||
|
} while (slow != fast);
|
||||||
|
slow = 0;
|
||||||
|
while (slow != fast) {
|
||||||
|
slow = nums[slow];
|
||||||
|
fast = nums[fast];
|
||||||
|
}
|
||||||
|
return slow;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
package com.markilue.leecode.test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*@BelongsProject: Leecode
|
||||||
|
*@BelongsPackage: com.markilue.leecode.test
|
||||||
|
*@Author: markilue
|
||||||
|
*@CreateTime: 2023-03-19 13:45
|
||||||
|
*@Description: TODO 尝试树形DP:构造一颗子树
|
||||||
|
*@Version: 1.0
|
||||||
|
*/
|
||||||
|
public class testMeiTuan {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
|
||||||
|
int num = sc.nextInt();
|
||||||
|
int[] energies = new int[num];
|
||||||
|
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
energies[i] = sc.nextInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
TreeNode[] nodeList = new TreeNode[num + 1];
|
||||||
|
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
int i1 = sc.nextInt();
|
||||||
|
nodeList[i1] = new TreeNode(i1, energies[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < num - 1; i++) {
|
||||||
|
int v1 = sc.nextInt();
|
||||||
|
int v2 = sc.nextInt();
|
||||||
|
nodeList[v1].childList.add(nodeList[v2]);
|
||||||
|
nodeList[v2].childList.add(nodeList[v1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println(nodeList);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TreeNode {
|
||||||
|
|
||||||
|
|
||||||
|
int value;
|
||||||
|
int energe;
|
||||||
|
List<TreeNode> childList = new ArrayList<>();//构造一个子树的子节点
|
||||||
|
|
||||||
|
public TreeNode() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public TreeNode(int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TreeNode(int value, int energe) {
|
||||||
|
this.value = value;
|
||||||
|
this.energe = energe;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TreeNode(int value, List<TreeNode> childList) {
|
||||||
|
this.value = value;
|
||||||
|
this.childList = childList;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
package meituan;
|
package com.markilue.interview;
|
||||||
|
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package meituan;
|
package com.markilue.interview;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package meituan;
|
package com.markilue.interview;
|
||||||
|
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package meituan;
|
package com.markilue.interview;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package meituan;
|
package com.markilue.interview;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.markilue.interview</groupId>
|
||||||
|
<artifactId>MiHayo</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.13.2</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.13.2</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>RELEASE</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
Loading…
Reference in New Issue