leecode更新

This commit is contained in:
markilue 2023-04-11 14:37:44 +08:00
parent 254893fc23
commit 771f6f7c32
2 changed files with 131 additions and 0 deletions

View File

@ -0,0 +1,91 @@
package com.markilue.leecode.hot100;
import java.util.Arrays;
/**
*@BelongsProject: Leecode
*@BelongsPackage: com.markilue.leecode.hot100
*@Author: markilue
*@CreateTime: 2023-04-11 12:47
*@Description:
* TODO 力扣581 最短无序连续子数组:
* 给你一个整数数组 nums 你需要找出一个 连续子数组 如果对这个子数组进行升序排序那么整个数组都会变为升序排序
* 请你找出符合题意的 最短 子数组并输出它的长度
*@Version: 1.0
*/
public class T98_FindUnsortedSubarray {
/**
* 官方排序法:
* TODO 最短的思路:
* 本质上就是考虑把数组分为三段子数组:numsA,numsB,numsC 当对numsB进行排序整个数组就会变得有序
* 所以要找到最短的numsB,就是找到最大的numsA和numsC的长度之和
* 因此将数组排序与原数组对比找到最长相同的前缀numsA和最长相同的后缀numsC,就可以最短numsB
* 时间复杂度O(nlogn)
* 时间击败36.47% 内存击败15.19% 6ms
* @param nums
* @return
*/
public int findUnsortedSubarray(int[] nums) {
if (isSorted(nums)) {
return 0;
}
int[] numsSorted = new int[nums.length];
System.arraycopy(nums, 0, numsSorted, 0, nums.length);
Arrays.sort(numsSorted);
int left = 0;
while (nums[left] == numsSorted[left]) {
left++;
}
int right = nums.length - 1;
while (nums[right] == numsSorted[right]) {
right--;
}
return right - left + 1;
}
public boolean isSorted(int[] nums) {
for (int i = 1; i < nums.length; i++) {
if (nums[i] < nums[i - 1]) {
return false;
}
}
return true;
}
/**
* 一次遍历:对于需要排序的优化:
* 时间复杂度O(n)
* 速度击败93.39% 内存击败68.96% 1ms
* @param nums
* @return
*/
public int findUnsortedSubarray1(int[] nums) {
//2,6,4,8,10,9,15
//升序开始索引:0,2,5
//降序开始索引:1,4
int n = nums.length;
int maxn = Integer.MIN_VALUE, right = -1;
int minn = Integer.MAX_VALUE, left = -1;
for (int i = 0; i < n; i++) {
// 因此 从左到右 找最大值 这期间如果有值比最大值还要小 那么这个值就有可能是 中段的右边界
//因为升序的时候左右段 最大值一直在替换所以最后一个小 它就是 中段的右边界
if (maxn > nums[i]) {
right = i;
} else {
maxn = nums[i];
}
//因此 从右到左 找最小值 这期间如果有值比最小值还要大 那么这个值就有可能是 中段的左边界
//因为降序的时候左右段 最小值一直在替换所以最后一个大 它就是 中段的左边界
if (minn < nums[n - i - 1]) {
left = n - i - 1;
} else {
minn = nums[n - i - 1];
}
}
return right == -1 ? 0 : right - left + 1;
}
}

View File

@ -0,0 +1,40 @@
package com.markilue.leecode.hot100;
import com.markilue.leecode.tree.TreeNode;
/**
*@BelongsProject: Leecode
*@BelongsPackage: com.markilue.leecode.hot100
*@Author: markilue
*@CreateTime: 2023-04-11 14:27
*@Description:
* TODO 力扣617 合并二叉树:
* 给你两棵二叉树 root1 root2
* 想象一下当你将其中一棵覆盖到另一棵之上时两棵树上的一些节点将会重叠而另一些不会你需要将这两棵树合并成一棵新二叉树合并的规则是如果两个节点重叠那么将这两个节点的值相加作为合并后节点的新值否则不为 null 的节点将直接作为新二叉树的节点
* 返回合并后的二叉树
* 注意: 合并过程必须从两个树的根节点开始
*@Version: 1.0
*/
public class T99_MergeTrees {
/**
* 递归法
* @param root1
* @param root2
* @return
*/
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null) {
return root2;
} else if (root2 == null) {
return root1;
}
//两者都不等于null
TreeNode root = new TreeNode(root1.val + root2.val);
root.left = mergeTrees(root1.left, root2.left);
root.right = mergeTrees(root1.right, root2.right);
return root;
}
}