优化代码结构,提高代码可读性和可维护性
This commit is contained in:
parent
392278d319
commit
e20cf9cea7
52
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode1143.java
Normal file
52
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode1143.java
Normal file
@ -0,0 +1,52 @@
|
||||
package cn.whaifree.leetCode.Dynamic;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/24 12:00
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode1143 {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
Solution solution = new Solution();
|
||||
int res = solution.longestCommonSubsequence("bsbininm","jmjkbkjkv" );
|
||||
System.out.println(res);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public int longestCommonSubsequence(String text1, String text2) {
|
||||
|
||||
// 公共子序列 dp[len1+1][len2+1]
|
||||
// dp[i][j] 表示 text1的前i-1与text2的前j-1中有多长的公共子序列长度
|
||||
// dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]
|
||||
// if text1[i]==text2[i]
|
||||
//
|
||||
//
|
||||
int len1 = text1.length();
|
||||
int len2 = text2.length();
|
||||
|
||||
int[][] dp = new int[len1 + 1][len2 + 1];
|
||||
|
||||
for (int i = 1; i <= len1; i++) {
|
||||
for (int j = 1; j <= len2; j++) {
|
||||
// 如果相等
|
||||
if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||
//dp[i][j] = Math.max(dp[i][j - 1] + 1, dp[i][j]);
|
||||
} else {
|
||||
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
|
||||
// dp[i][j] = Math.max(dp[i - 1][j - 1], Math.max(dp[i - 1][j], dp[i][j - 1]));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return dp[len1][len2];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
79
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode300.java
Normal file
79
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode300.java
Normal file
@ -0,0 +1,79 @@
|
||||
package cn.whaifree.leetCode.Dynamic;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/22 13:23
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode300 {
|
||||
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
int[] nums = {4,10,4,3,8,9};
|
||||
Solution solution = new Solution();
|
||||
int i = solution.lengthOfLIS(nums);
|
||||
System.out.println(i);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
/**
|
||||
* int[i][j] 表示i-j的最长严格递增子序列长度
|
||||
* @param nums
|
||||
* @return
|
||||
*/
|
||||
public int lengthOfLIS(int[] nums) {
|
||||
int[] dp = new int[nums.length];
|
||||
|
||||
|
||||
// dp[i]表示i之前包括i的以(nums[i]结尾)(即每次都必须包括i,每次都需要和i比较)的最长递增子序列的长度
|
||||
// 位置i的最长升序子序列 = j从0到i-1各个位置的 最长升序子序列 + 1 的 最大值
|
||||
Arrays.fill(dp, 1);
|
||||
int res = 1;
|
||||
for (int i = 1; i < nums.length; i++) {
|
||||
for (int j = 0; j < i; j++) {
|
||||
if (nums[j] < nums[i]) {
|
||||
dp[i] = Math.max(dp[i], dp[j] + 1);
|
||||
}
|
||||
}
|
||||
|
||||
res = Math.max(res, dp[i]);// 取长的子序列
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Solution1 {
|
||||
|
||||
public int lengthOfLIS(int[] nums) {
|
||||
// 最长严格递增子序列的长度
|
||||
/**
|
||||
* dp[i] 表示包含从0-i包含i(i在每次循环中是最后一个)的最长递增子序列的长度
|
||||
*/
|
||||
int[] dp = new int[nums.length];
|
||||
Arrays.fill(dp, 1); // 最初就是1个
|
||||
|
||||
int res = 1;
|
||||
for (int i = 1; i < nums.length; i++) {
|
||||
for (int j = 0; j < i; j++) {
|
||||
// 从0到i-1
|
||||
// nums[j] < nums[i] 就证明 nums[j] 小于 nums[i] ,前面有多少个j就计算多少次
|
||||
if (nums[j] < nums[i]) {
|
||||
dp[i] = Math.max(dp[i], dp[j] + 1); // dp[i] 为0-(j-1)的最长递增子序列长度,dp[j] + 1 为0-j的最长递增子序列长度,取两者最大值
|
||||
}
|
||||
}
|
||||
res = Math.max(res, dp[i]); // 每次获得以i为最后一个的最长递增子序列的长度
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
95
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode674.java
Normal file
95
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode674.java
Normal file
@ -0,0 +1,95 @@
|
||||
package cn.whaifree.leetCode.Dynamic;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/23 11:56
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode674 {
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
|
||||
int[] nums = new int[]{1,1,1,1};
|
||||
int lengthOfLCIS = new Solution1().findLengthOfLCIS(nums);
|
||||
System.out.println(lengthOfLCIS);
|
||||
}
|
||||
|
||||
class Solution2 {
|
||||
/**
|
||||
* 如果当前元素大于前一个元素,则递增计数,并将计数与结果中的最大值进行比较更新。
|
||||
* 如果当前元素不大于前一个元素,则将计数重置为1。
|
||||
* @param nums
|
||||
* @return
|
||||
*/
|
||||
public int findLengthOfLCIS(int[] nums) {
|
||||
int res = 1;
|
||||
int count = 1;
|
||||
for (int i = 1; i < nums.length; i++) {
|
||||
if (nums[i] > nums[i - 1]) {
|
||||
count++;
|
||||
res = Math.max(res, count);
|
||||
} else {
|
||||
count = 1;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
class Solution {
|
||||
|
||||
|
||||
/**
|
||||
* 最长且 连续递增的子序列
|
||||
* @param nums
|
||||
* @return
|
||||
*/
|
||||
public int findLengthOfLCIS(int[] nums) {
|
||||
// 找到所有递增区间
|
||||
int left = 0;
|
||||
int right = 0;
|
||||
int maxLength = 0;
|
||||
while (right < nums.length - 1) {
|
||||
if (nums[right + 1] <= nums[right]) {
|
||||
maxLength = Math.max(maxLength, right - left + 1);
|
||||
right++;
|
||||
left = right;
|
||||
}else {
|
||||
right++;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.max(maxLength, right - left + 1);
|
||||
}
|
||||
}
|
||||
|
||||
class Solution1 {
|
||||
public int findLengthOfLCIS(int[] nums) {
|
||||
/**
|
||||
* dp[i] 表示可包含i的最长子序列长度
|
||||
* if nums[i] > nums[i-1] 递增
|
||||
* dp[i] = dp[i-1]+1
|
||||
* else
|
||||
* dp[i] = 1 一旦出现递减,因为前面的连续递增是不能用的,需要直接重置
|
||||
*/
|
||||
int[] dp = new int[nums.length];
|
||||
dp[0] = 1;
|
||||
int ans = 1;
|
||||
for (int i = 1; i < nums.length; i++) {
|
||||
if (nums[i] > nums[i-1]) {
|
||||
dp[i] = dp[i-1] + 1;
|
||||
}else {
|
||||
dp[i] = 1;
|
||||
}
|
||||
ans = Math.max(ans, dp[i]);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
78
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode718.java
Normal file
78
src/main/java/cn/whaifree/leetCode/Dynamic/LeetCode718.java
Normal file
@ -0,0 +1,78 @@
|
||||
package cn.whaifree.leetCode.Dynamic;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/23 12:22
|
||||
* @注释
|
||||
*/
|
||||
|
||||
public class LeetCode718 {
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
int[] nums1 = {1,2,3,2,1};
|
||||
int[] nums2 = {3,2,1,4,7};
|
||||
|
||||
int i = new Solution1().findLength(nums1, nums2);
|
||||
System.out.println(i);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public int findLength(int[] nums1, int[] nums2) {
|
||||
|
||||
/**
|
||||
* 用二维数组可以记录两个字符串的所有比较情况
|
||||
* dp[i][j] 表示 以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度
|
||||
* dp[i][j] 可以由dp[i-1][j-1] + 1 和 0 两种情况推出
|
||||
*
|
||||
* dp[i][j]
|
||||
* if nums1[i]==nums[j]
|
||||
* dp[i][j] = dp[i-1][j-1] + 1
|
||||
* else
|
||||
* dp[i][j] = 0
|
||||
*/
|
||||
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
|
||||
int res = 0;
|
||||
for (int i = 1; i <= nums1.length; i++) {
|
||||
for (int j = 1; j <= nums2.length; j++) {
|
||||
if (nums1[i - 1] == nums2[j - 1]) {
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||
} else {
|
||||
dp[i][j] = 0;
|
||||
}
|
||||
res = Math.max(res, dp[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
class Solution1 {
|
||||
public int findLength(int[] nums1, int[] nums2) {
|
||||
|
||||
/**
|
||||
* dp[i][j]都是由dp[i - 1][j - 1]推出。那么压缩为一维数组,也就是dp[j]都是由dp[j - 1]推出。
|
||||
*
|
||||
*/
|
||||
int[] dp = new int[nums1.length + 1];
|
||||
int res = 0;
|
||||
for (int i = 1; i <= nums1.length; i++) {
|
||||
for (int j = nums2.length; j > 0; j--) { // 从后面开始比较,避免重复覆盖dp[i]
|
||||
if (nums1[i - 1] == nums2[j - 1]) {
|
||||
dp[j] = dp[j - 1] + 1;
|
||||
} else {
|
||||
dp[j] = 0;
|
||||
}
|
||||
res = Math.max(res, dp[j]);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
103
src/main/java/cn/whaifree/redo/redo_24_4_20/LeetCode32.java
Normal file
103
src/main/java/cn/whaifree/redo/redo_24_4_20/LeetCode32.java
Normal file
@ -0,0 +1,103 @@
|
||||
package cn.whaifree.redo.redo_24_4_20;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/22 11:20
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode32 {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
int i = new Solution1().longestValidParentheses("()(()");
|
||||
System.out.println(i);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
/**
|
||||
* 左右括号的数量,遇到右括号数量>左括号就重置
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public int longestValidParentheses(String s) {
|
||||
int max = 0;
|
||||
|
||||
int left = 0, right = 0;
|
||||
for (int i = 0; i < s.length(); i++) {
|
||||
if (s.charAt(i) == '(') {
|
||||
left++;
|
||||
}else {
|
||||
right++;
|
||||
}
|
||||
|
||||
if (left == right) {
|
||||
max = Math.max(max, 2 * right);
|
||||
}
|
||||
|
||||
if (left < right) {
|
||||
left = 0;
|
||||
right = 0;
|
||||
}
|
||||
}
|
||||
|
||||
left = 0;
|
||||
right = 0;
|
||||
for (int i = s.length() - 1; i > 0; i--) {
|
||||
if (s.charAt(i) == '(') {
|
||||
left++;
|
||||
} else {
|
||||
right++;
|
||||
}
|
||||
|
||||
if (left == right) {
|
||||
max = Math.max(max, 2 * right);
|
||||
}
|
||||
|
||||
if (left > right) {
|
||||
left = 0;
|
||||
right = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return max;
|
||||
}
|
||||
}
|
||||
|
||||
class Solution1 {
|
||||
public int longestValidParentheses(String s) {
|
||||
Deque<Integer> stack = new LinkedList<>();
|
||||
// boolean 判断是否出现过
|
||||
boolean[] flag = new boolean[s.length()];
|
||||
char[] chars = s.toCharArray();
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
if (chars[i] == '(') {
|
||||
stack.push(i);
|
||||
}else if (!stack.isEmpty()){
|
||||
Integer index = stack.pop();
|
||||
flag[index] = true;
|
||||
flag[i] = true;
|
||||
}
|
||||
}
|
||||
// 计算boolean[]中连续true的数量
|
||||
int max = 0;
|
||||
int now = 0;
|
||||
for (boolean b : flag) {
|
||||
if (b) {
|
||||
now++;
|
||||
}else {
|
||||
now = 0;
|
||||
}
|
||||
max = Math.max(max, now);
|
||||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
48
src/main/java/cn/whaifree/redo/redo_24_4_20/LeetCode337.java
Normal file
48
src/main/java/cn/whaifree/redo/redo_24_4_20/LeetCode337.java
Normal file
@ -0,0 +1,48 @@
|
||||
package cn.whaifree.redo.redo_24_4_20;
|
||||
|
||||
import cn.whaifree.leetCode.model.TreeNode;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/22 11:44
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode337 {
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
|
||||
int rob = new Solution().rob(TreeNode.constructTreeByArray(1));
|
||||
System.out.println(rob);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public int rob(TreeNode root) {
|
||||
int[] circle = circle(root);
|
||||
return Math.max(circle[0], circle[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* int[0] 表示 不偷该点的最大收益
|
||||
* int[1] 表示 偷该点的最大收益
|
||||
* @param root
|
||||
* @return
|
||||
*/
|
||||
public int[] circle(TreeNode root) {
|
||||
if (root == null) {
|
||||
return new int[]{0, 0};
|
||||
}
|
||||
|
||||
int[] left = circle(root.left);
|
||||
int[] right = circle(root.right);
|
||||
int[] res = new int[2];
|
||||
// 该店不偷,子节点可偷可不偷 只要最大收益
|
||||
res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
|
||||
res[1] = left[0] + right[0] + root.val;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
91
src/main/java/cn/whaifree/redo/redo_24_4_20/LeetCode84.java
Normal file
91
src/main/java/cn/whaifree/redo/redo_24_4_20/LeetCode84.java
Normal file
@ -0,0 +1,91 @@
|
||||
package cn.whaifree.redo.redo_24_4_20;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/4/22 11:51
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode84 {
|
||||
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
int[] heights = {2,1,2};
|
||||
int i = new Solution1().largestRectangleArea(heights);
|
||||
System.out.println(i);
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public int largestRectangleArea(int[] heights) {
|
||||
if (heights.length == 1) {
|
||||
return heights[0];
|
||||
}
|
||||
/**
|
||||
* 找到凸点
|
||||
* 对于每个index,找到左右第一个比他矮的
|
||||
*/
|
||||
|
||||
int length = heights.length;
|
||||
int[] left = new int[length];
|
||||
int[] right = new int[length];
|
||||
left[0] = -1;
|
||||
|
||||
int leftIndex = 0; // 标记第一个小于当前i的
|
||||
for (int i = 1; i < length; i++) {
|
||||
leftIndex = i - 1;
|
||||
while (leftIndex >= 0 && heights[leftIndex] >= heights[i]) {
|
||||
// 也可以简单粗暴的leftIndex--,但会超时
|
||||
leftIndex = left[leftIndex];
|
||||
}
|
||||
left[i] = leftIndex;
|
||||
}
|
||||
|
||||
right[length - 1] = length;
|
||||
int rightIndex = 0; // 标记第一个小于当前i的
|
||||
for (int i = length - 2; i >= 0; i--) {
|
||||
rightIndex = i + 1;
|
||||
while (rightIndex <= length - 1 && heights[rightIndex] >= heights[i]) {
|
||||
rightIndex = right[rightIndex];
|
||||
}
|
||||
right[i] = rightIndex;
|
||||
}
|
||||
|
||||
int maxRegin = 0;
|
||||
for (int i = 0; i < length; i++) {
|
||||
maxRegin = Math.max(heights[i] * (right[i] - left[i] - 1), maxRegin);
|
||||
}
|
||||
return maxRegin;
|
||||
}
|
||||
}
|
||||
|
||||
class Solution1 {
|
||||
public int largestRectangleArea(int[] heights) {
|
||||
|
||||
int[] ints = new int[heights.length + 2];
|
||||
System.arraycopy(heights, 0, ints, 1, heights.length);
|
||||
heights = ints;
|
||||
|
||||
Deque<Integer> stack = new LinkedList<>();
|
||||
stack.push(0);
|
||||
int maxRegin = 0;
|
||||
for (int i = 1; i < heights.length; i++) {
|
||||
if (heights[i] < heights[stack.peek()]) {
|
||||
while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) {
|
||||
Integer pop = stack.pop();
|
||||
if (!stack.isEmpty()) {
|
||||
maxRegin = Math.max(maxRegin, (i - stack.peek() - 1) * heights[pop]);
|
||||
}
|
||||
}
|
||||
}
|
||||
stack.push(i);
|
||||
}
|
||||
return maxRegin;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user