From 21761b49b551818b3ad138b46e37e8e064853daf Mon Sep 17 00:00:00 2001 From: whai Date: Sat, 6 Apr 2024 18:20:51 +0800 Subject: [PATCH] redo --- .../whaifree/leetCode/Array/LeetCode31.java | 161 ++++++++++++++++++ .../leetCode/LeetCode/LeetCode32.java | 155 +++++++++++++++++ .../leetCode/LinkedList/LeetCode23.java | 129 ++++++++++++++ .../whaifree/leetCode/String/LeetCode10.java | 39 +++++ .../redo/redo_24_4_1/LeetCode209.java | 73 ++++++++ .../redo/redo_24_4_1/LeetCode279.java | 78 +++++++++ .../redo/redo_24_4_1/LeetCode322.java | 49 ++++++ .../redo/redo_24_4_1/LeetCode377.java | 45 +++++ .../redo/redo_24_4_1/LeetCode474.java | 74 ++++++++ .../redo/redo_24_4_1/LeetCode494.java | 47 +++++ .../whaifree/redo/redo_24_4_1/LeetCode53.java | 126 ++++++++++++++ .../whaifree/redo/redo_24_4_6/LeetCode11.java | 42 +++++ 12 files changed, 1018 insertions(+) create mode 100644 src/main/java/cn/whaifree/leetCode/Array/LeetCode31.java create mode 100644 src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode32.java create mode 100644 src/main/java/cn/whaifree/leetCode/LinkedList/LeetCode23.java create mode 100644 src/main/java/cn/whaifree/leetCode/String/LeetCode10.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode209.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode279.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode322.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode377.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode474.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode494.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode53.java create mode 100644 src/main/java/cn/whaifree/redo/redo_24_4_6/LeetCode11.java diff --git a/src/main/java/cn/whaifree/leetCode/Array/LeetCode31.java b/src/main/java/cn/whaifree/leetCode/Array/LeetCode31.java new file mode 100644 index 0000000..00147ad --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/Array/LeetCode31.java @@ -0,0 +1,161 @@ +package cn.whaifree.leetCode.Array; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/5 13:18 + * @注释 + */ +public class LeetCode31 { + @Test + public void test() { + int[] nums = {3,2,1}; + new Solution1().nextPermutation(nums); + + for (int i = 0; i < nums.length; i++) { + System.out.print(nums[i] + " "); + } + + } + + class Solution { + public void nextPermutation(int[] nums) { + if (nums.length == 1) { + return; + } + + // 1.下一个数 比当前数大 + // 将后面的「大数」与前面的「小数」交换,就能得到更大的数 + // 2. 下一个数 增加的幅度尽可能的小 + // - 尽可能靠右的低位 进行交换 + // - 将一个 尽可能小的「大数」 与前面的「小数」交换 + // 123465 把 5和4换 + // - 「大数」后面的所有数 重置为升序 + // 123564 把5后面重新排序 + + // 1. 从后往前找到第一个升序排列,此时后面那部分一定是降序 + int i; + for (i = nums.length - 2; i >= 0; i--) { + if (nums[i] < nums[i + 1]) { + break; + } + } + if (i == -1) { + // 最后一个排序 654321,直接逆转 + reverse(nums, 0, nums.length - 1); + return; + } + + // 2. 从i+1开始找到最小的值 + int min; + for (min = nums.length - 1; min > 0; min--) { + if (nums[min] > nums[i]) { + break; + } + } + // 3. 交换i和minIndex + swap(nums, i, min); + // 4. 后面为降序,直接让其逆转变为升序 + reverse(nums, i + 1, nums.length - 1); + + + } + + public void reverse(int[] nums, int start, int end) { + while (start < end) { + swap(nums, start, end); + start++; + end--; + } + } + + public void swap(int[] nums, int i, int j) { + int temp = nums[i]; + nums[i] = nums[j]; + nums[j] = temp; + } + } + + class Solution1 { + public void nextPermutation(int[] nums) { + if (nums.length == 1) { + return; + } + + int i = nums.length - 2; + while (i >= 0) { + if (nums[i] < nums[i + 1]) { + break; + } + i--; + } + + if (i == -1) { + // 最后一个排序 654321,直接逆转 + reverse(nums, 0, nums.length - 1); + return; + } + + int min = nums.length - 1; + while (min > 0) { + if (nums[min] > nums[i]) { + break; + } + min--; + } + + + // 3. 交换i和minIndex + swap(nums, i, min); + // 4. 后面为降序,直接让其逆转变为升序 + reverse(nums, i + 1, nums.length - 1); + } + + public void reverse(int[] nums, int start, int end) { + while (start < end) { + swap(nums, start, end); + start++; + end--; + } + } + + public void swap(int[] nums, int i, int j) { + int temp = nums[i]; + nums[i] = nums[j]; + nums[j] = temp; + } + } + + + +} + +class ass extends as{ + + @Override + public void test() { + + } + + @Override + void test1() { + + } + + @Override + protected void test2() { + + } +} + + +abstract class as{ + + abstract public void test() ; + + abstract void test1(); + + abstract protected void test2(); +} diff --git a/src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode32.java b/src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode32.java new file mode 100644 index 0000000..b3ea311 --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/LeetCode/LeetCode32.java @@ -0,0 +1,155 @@ +package cn.whaifree.leetCode.LeetCode; + +import org.junit.Test; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 11:27 + * @注释 + */ +public class LeetCode32 { + @Test + public void test() { + int i = new Solution3().longestValidParentheses("(()"); + System.out.println(i); + } + + class Solution { + /** + * 找出最长有效(格式正确且连续)括号子串的长度。 + * + * dp[i] 表示从0-i内最长有效括号子串的长度 + * + * if char[i]='(' || retailLeft<0 + * = dp[i-1] + * if char[i]=')'&&retailLeft>0 + * = dp[i-1]+2 + * + * @param s + * @return + */ + public int longestValidParentheses(String s) { + char[] chars = s.toCharArray(); + int[] dp = new int[s.length() + 1]; + int retailLeft = 0; + for (int i = 0; i < chars.length; i++) { + if (chars[i] == '(' ) { + retailLeft++; + dp[i] = dp[i - 1]; + } else if (chars[i] == ')' && retailLeft > 0) { + + } + } + + + return 0; + } + + } + + class Solution1 { + /** + * ()(() + * + * ... + * + * 1.匹配成功 用栈匹配,把所有匹配成功的flag设置为1 + * 2.最长连续 统计flag中最长连续1的长度 + * + * @param s + * @return + */ + public int longestValidParentheses(String s) { + int[] flag = new int[s.length()]; + Deque stack = new LinkedList<>(); + + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '(') { + stack.push(i); + } else if (!stack.isEmpty()) { + Integer pop = stack.pop(); + if (s.charAt(pop) == '(') { + flag[i] = 1; + flag[pop] = 1; + } + } + } + + // 计算flag中最长连续出现1的次数 + int len = 0; + int maxLen = Integer.MIN_VALUE; + for (int i = 0; i < flag.length; i++) { + if (flag[i] == 1) { + len += 1; + }else { + maxLen = Math.max(maxLen,len); + len = 0; + } + } + + return Math.max(maxLen, len); // (() 这个用例 + } + } + class Solution3 { + /** + * 使用两个计数器 + * - 当两个计数器相等 则检查最长匹配 + * - 当右边比左边还多,重置 + * + * 需要 从前往后+从后往前 + * + * @param s + * @return + */ + public int longestValidParentheses(String s) { + int left = 0, right = 0, maxlength = 0; + // 左右计数器, + // - 一旦右边计数比左边大的时候,重置 + // - 左右计数器相等的时候,匹配maxLength + + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '(') { + left++; + } else if (s.charAt(i) == ')') { + right++; + } + + if (left == right) { + maxlength = Math.max(maxlength, left + right); + } else if (right > left) { + // 右边比左边还多,重置,重新计算 + right = 0; + left = 0; + } + } + // 重新从下一个字符开始计算,但这样会漏掉一种情况,就是遍历的时候左括号的数量始终大于右括号的数量,即 (() ,这种时候最长有效括号是求不出来的。 + + // 只要从左到右再来一次, + + left = 0; + right = 0; + for (int i = s.length() - 1; i > 0; i--) { + if (s.charAt(i) == '(') { + left++; + } else if (s.charAt(i) == ')') { + right++; + } + + if (left == right) { + maxlength = Math.max(maxlength, left + right); + } else if (left > right) { + // 右边比左边还多,重置,重新计算 + right = 0; + left = 0; + } + } + + return maxlength; + } + } + +} diff --git a/src/main/java/cn/whaifree/leetCode/LinkedList/LeetCode23.java b/src/main/java/cn/whaifree/leetCode/LinkedList/LeetCode23.java new file mode 100644 index 0000000..910aa3c --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/LinkedList/LeetCode23.java @@ -0,0 +1,129 @@ +package cn.whaifree.leetCode.LinkedList; + +import cn.whaifree.leetCode.model.ListNode; +import org.junit.Test; + +import java.util.*; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/5 12:00 + * @注释 + */ +public class LeetCode23 { + + @Test + public void test() + { + new Solution2().mergeKLists( + new ListNode[]{ + ListNode.listNodeFromArray(new int[]{}), + ListNode.listNodeFromArray(new int[]{1, 3, 4}), + ListNode.listNodeFromArray(new int[]{2, 6}) + } + ).printList(); + } + + class Solution { + public ListNode mergeKLists(ListNode[] lists) { + if (lists.length == 0) { + return null; + } + List arrayList = new ArrayList<>(Arrays.asList(lists)); + return merge(arrayList); + } + + public ListNode merge(List lists) { + // 删除list中所有null + // 使用removeIf()方法删除所有null元素 + lists.removeIf(Objects::isNull); + + if (lists.size() == 0) { + return null; + } + + int minIndex = 0; + // 找到最小的返回 + // 这个最小的的下一个就是递归的 + + // 找到最小的头节点的位置 + for (int i = 0; i < lists.size(); i++) { + if (lists.get(minIndex).val > lists.get(i).val) { + minIndex = i; + } + } + ListNode minNode = lists.get(minIndex); + // 去掉本节点 + lists.set(minIndex, minNode.next); + minNode.next = merge(lists); + return minNode; + + } + + } + + + class Solution1 { + public ListNode mergeKLists(ListNode[] lists) { + for (int i = 1; i < lists.length; i++) { + lists[i] = merge(lists[i], lists[i - 1]); + } + return lists[lists.length - 1]; + } + + public ListNode merge(ListNode one, ListNode two) { + if (one == null) { + return two; + } else if (two == null){ + return one; + } + + if (one.val < two.val) { + one.next = merge(one.next, two); + return one; + }else { + two.next = merge(one, two.next); + return two; + } + } + + } + + class Solution2 { + // 时间复杂度: + // O(nlogk),其中 k 为 lists的长度,n 为所有链表的节点数之和。 + + //著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + public ListNode mergeKLists(ListNode[] lists) { + + + PriorityQueue queue = new PriorityQueue<>(new Comparator() { + @Override + public int compare(ListNode o1, ListNode o2) { + return o1.val - o2.val; + } + }); + + for (ListNode list : lists) { + if (list!=null) queue.add(list); + } + + ListNode head = new ListNode(-1); + ListNode headIndex = head; + while (!queue.isEmpty()) { + ListNode poll = queue.poll(); + headIndex.next = poll; + headIndex = headIndex.next; + if (poll.next != null) { + queue.add(poll.next); + } + } + + return head.next; + } + + + } + +} diff --git a/src/main/java/cn/whaifree/leetCode/String/LeetCode10.java b/src/main/java/cn/whaifree/leetCode/String/LeetCode10.java new file mode 100644 index 0000000..28d1c84 --- /dev/null +++ b/src/main/java/cn/whaifree/leetCode/String/LeetCode10.java @@ -0,0 +1,39 @@ +package cn.whaifree.leetCode.String; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/5 11:36 + * @注释 + */ +public class LeetCode10 { + + class Solution { + public boolean isMatch(String s, String p) { + + char[] sChar = s.toCharArray(); + char[] pChar = p.toCharArray(); + /** + * dp[sIndex][pIndex]表示s字符串的前sIndex个字符是否和p字符串的前pIndex个字符完成正则表达式的匹配 + * + * 当p字符串的第pIndex个字符不为*时 + * if p第pIndex个字符与s的第sIndex个字符匹配 + * dp[sIndex][pIndex] = + * f[sIndex - 1][pIndex - 1](即:s的前sIndex - 1个字符和p的前pIndex-1个字符的匹配结果)。 + * 如果p第pIndex个字符与s的第sIndex个字符不匹配, + * 则结果为false; + * 当p字符串的第pIndex个字符为*时 + * 此时*前面的符号可以出现0次或任意次 + * - x出现0次 + * 此时结果为f[sIndex][pIndex - 2]。此时相当于删除了*以及x + * - x出现非0的任意次, 此时的结果为f[sIndex - 1][pIndex] && (p.charAt(pIndex - 2) == '.' || p.charAt(pIndex - 2) == s.charAt(sIndex - 1)); + * + */ + + + return false; + + } + } + +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode209.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode209.java new file mode 100644 index 0000000..1d6f22d --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode209.java @@ -0,0 +1,73 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +import java.util.Arrays; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 15:07 + * @注释 + */ +public class LeetCode209 { + @Test + public void test() { + + int[] nums = {2, 3, 1, 2, 4, 3}; + int target = 7; + int i = new Solution2().minSubArrayLen(target, nums); + System.out.println(i); + } + + class Solution { + public int minSubArrayLen(int target, int[] nums) { + int right = 0; + int left = 0; + int sum = 0; + int minLength = Integer.MAX_VALUE; + while (right < nums.length) { + sum += nums[right]; + while (left <= right && sum >= target) { + minLength = Math.min(minLength, right - left + 1); + sum -= nums[left]; + left++; + } + right++; + } + return minLength == Integer.MAX_VALUE ? 0 : minLength; + } + } + + class Solution2 { + /** + * + * @param target + * @param nums + * @return + */ + public int minSubArrayLen(int target, int[] nums) { + + // 前缀和 + int[] preSum = new int[nums.length + 1]; + for (int i = 1; i < preSum.length; i++) { + preSum[i] = preSum[i - 1] + nums[i - 1]; + } + + + int minLen = Integer.MAX_VALUE; + for (int i = 0; i < preSum.length; i++) { + // preSum[right] = target + preSum[i] + int fill = target + preSum[i]; + int right = Arrays.binarySearch(preSum, fill); + if (right < 0) { + right = -right - 1; + } + if (right < preSum.length) { + minLen = Math.min(minLen, right - i); + } + } + return minLen == Integer.MAX_VALUE ? 0 : minLen; + } + } +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode279.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode279.java new file mode 100644 index 0000000..290f320 --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode279.java @@ -0,0 +1,78 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +import java.util.Arrays; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 16:07 + * @注释 + */ +public class LeetCode279 { + + @Test + public void test() + { + Solution solution = new Solution(); + int i = solution.numSquares3(1); + System.out.println(i); + } + + class Solution { + public int numSquares(int n) { + + // dp[j] 表示从[0-i*i]和为j的完全平方数的数量 + // dp[j] = dp[j-i*i]+1 + int[] dp = new int[n+1]; + int sqrt = (int) Math.sqrt(n); + Arrays.fill(dp, Integer.MAX_VALUE); + + + dp[0] = 0; + for (int j = 1; j < n + 1; j++) { + for (int i = 1; i <= sqrt; i++) { + if (j >= i * i) { + dp[j] = Math.min(dp[j], dp[j - i * i] + 1); + } + } + } + return dp[n]; + } + + public int numSquares1(int n) { + + // dp[j] 表示从[0-i*i]和为j的完全平方数的数量 + // dp[j] = dp[j-i*i]+1 + int[] dp = new int[n+1]; + Arrays.fill(dp, Integer.MAX_VALUE); + + + dp[0] = 0; + for (int j = 1; j < n + 1; j++) { + for (int i = 1; i * i <= j; i++) { + dp[j] = Math.min(dp[j], dp[j - i * i] + 1); + } + } + return dp[n]; + } + + public int numSquares3(int n) { + + // dp[j] 表示从[0-i*i]和为j的完全平方数的数量 + // dp[j] = dp[j-i*i]+1 + int[] dp = new int[n+1]; + Arrays.fill(dp, Integer.MAX_VALUE); + + + dp[0] = 0; + for (int i = 1; i <= n; i++) { + for (int j = i * i; j <= n; j++) { + dp[j] = Math.min(dp[j], dp[j - i * i] + 1); + } + } + return dp[n]; + } + } +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode322.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode322.java new file mode 100644 index 0000000..50bb77c --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode322.java @@ -0,0 +1,49 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +import java.util.Arrays; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 16:28 + * @注释 + */ +public class LeetCode322 { + @Test + public void test() { + int[] coins = { 2 }; + int amount = 3; + Solution solution = new Solution(); + int i = solution.coinChange(coins, amount); + System.out.println(i); + } + + class Solution { + /** + * 背包容量amount+1 + * + * dp[j] 表示从0-i中任意取放入amount + * dp[j] = math.min(dp[j] , dp[j-coins[i]]+1) + * + * + * @param coins + * @param amount + * @return + */ + public int coinChange(int[] coins, int amount) { + int[] dp = new int[amount + 1]; + Arrays.fill(dp, Integer.MAX_VALUE); + dp[0] = 0; + for (int i = 0; i < coins.length; i++) { + for (int j = coins[i]; j < amount + 1; j++) { + if (dp[j - coins[i]] != Integer.MAX_VALUE) { + dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1); + } + } + } + return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount]; + } + } +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode377.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode377.java new file mode 100644 index 0000000..b1240f7 --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode377.java @@ -0,0 +1,45 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 17:00 + * @注释 + */ +public class LeetCode377 { + + @Test + public void test() { + Solution solution = new Solution(); + int[] nums = {9}; + int target = 3; + int i = solution.combinationSum4(nums, target); + System.out.println(i); + } + + class Solution { + public int combinationSum4(int[] nums, int target) { + int[] dp = new int[target + 1]; + + dp[0] = 1; + + for (int j = 0; j < target + 1; j++) { + for (int i = 0; i < nums.length; i++) { + if (nums[i] <= j) { + dp[j] = dp[j] + dp[j - nums[i]]; + } + } + } + +// for (int i = 0; i < nums.length; i++) { +// for (int j = nums[i]; j <= target; j++) { +// dp[j] = dp[j] + dp[j - nums[i]]; +// } +// } + + return dp[target]; + } + } +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode474.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode474.java new file mode 100644 index 0000000..c576bc7 --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode474.java @@ -0,0 +1,74 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 17:08 + * @注释 + */ +public class LeetCode474 { + + @Test + public void test() { + String[] strs = new String[]{"10", "0001", "111001", "1", "0"}; + int m = 5; + int n = 3; + System.out.println(new Solution().findMaxForm(strs, m, n)); + } + + class Solution { + public int findMaxForm(String[] strs, int m, int n) { + + /** + * dp[i][j][k] 表示包含 i个0,j个1,从前k个子集中取出的最大子集长度 + * + * i j 为背包容量 + * k为物品 + * + * for 背包 + * 统计0,1数量 + * fori + * forj + * if(i>=zero j>=one) + * dp[i][j][k] = max(dp[i][j][k-1],dp[i-zero][j-one][k-1]+1) + * else + * dp[i][j][k] = dp[i][j][k-1] + * + */ + + + int[][][] dp = new int[m + 1][n + 1][strs.length + 1]; + + for (int k = 1; k <= strs.length; k++) { + String str = strs[k-1]; + int zero = calculateZeroNumber(str); + int one = str.length() - zero; + for (int i = 0; i <= m; i++) { + for (int j = 0; j <= n; j++) { + if (i >= zero && j >= one) { + dp[i][j][k] = Math.max(dp[i][j][k - 1], dp[i - zero][j - one][k - 1] + 1); + } else { + dp[i][j][k] = dp[i][j][k - 1]; + } + } + } + } + + return dp[m][n][strs.length]; + } + + public int calculateZeroNumber(String str) { + int num = 0; + for (int i = 0; i < str.length(); i++) { + if (str.charAt(i) == '0') { + num++; + } + } + return num; + } + + + } +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode494.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode494.java new file mode 100644 index 0000000..8b569e1 --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode494.java @@ -0,0 +1,47 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 17:34 + * @注释 + */ +public class LeetCode494 { + + @Test + public void test() + { + Solution solution = new Solution(); + int[] nums = new int[]{1, 1, 1, 1, 1}; + int target = 3; + int i = solution.findTargetSumWays(nums, target); + System.out.println(i); + } + + class Solution { + public int findTargetSumWays(int[] nums, int target) { + int sum = 0; + for (int i = 0; i < nums.length; i++) { + sum += nums[i]; + } + if (Math.abs(target) > sum) return 0; // 此时没有方案 + if ((target + sum) % 2 == 1) return 0; // 此时没有方案 + + int left = (sum + target) / 2; + + // dp[j] 表示 从0-i 中任意取,背包容量为 j 时,能装下的组合数 + // dp[j] = dp[j] + dp[j-nums[i]] + int[] dp = new int[left + 1]; + dp[0] = 1; + for (int i = 0; i < nums.length; i++) { + for (int j = left; j >= nums[i]; j--) { + // 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。 + dp[j] = dp[j] + dp[j - nums[i]]; + } + } + return dp[left]; + } + } +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode53.java b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode53.java new file mode 100644 index 0000000..19fe657 --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_1/LeetCode53.java @@ -0,0 +1,126 @@ +package cn.whaifree.redo.redo_24_4_1; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 12:44 + * @注释 + */ +public class LeetCode53 { + + @Test + public void test() { + + int[] nums = new int[]{1}; + int maxSubArray = new Solution1().maxSubArray(nums); + System.out.println(maxSubArray); + } + + class Solution { + public int maxSubArray(int[] nums) { + // 滑动窗口 + // 遇到和为负数就一直缩小left + + int maxSum = Integer.MIN_VALUE; + int nowSum = 0; + for (int i = 0; i < nums.length; i++) { + nowSum += nums[i]; + maxSum = Math.max(maxSum, nowSum); + if (nowSum < 0) { + nowSum = 0; + } + } + return maxSum; + } + } + + + class Solution1 { + /** + * dp + * + * dp[i] 表示i处结尾的的最大连续子数组的和 + * + * dp[0] = nums[0] + * dp[i] + * if nums[i]+dp[i-1] > 0 + * dp[i] = dp[i-1]+nums[i] + * else + * dp[i] = nums[i] + * + * @param nums + * @return + */ + public int maxSubArray(int[] nums) { + int[] dp = new int[nums.length]; + dp[0] = nums[0]; + int max = nums[0]; + for (int i = 1; i < nums.length; i++) { + if (dp[i - 1] > 0 && nums[i] + dp[i - 1] > 0) { + dp[i] = dp[i - 1] + nums[i]; + } else { + dp[i] = nums[i]; + } + max = Math.max(max, dp[i]); + } + return max; + } + } + + class Solution4 { + /** + * 前缀和 + * @param nums + * @return + */ +// public int maxSubArray(int[] nums) { +// +// int[] preSum = new int[nums.length + 1]; +// for (int i = 1; i < nums.length; i++) { +// preSum[i] = preSum[i - 1] + nums[i - 1]; +// } +// +// +// } + } + + +} + +class XieChen { + + /** + * 将偶数的区间/2 让整个区间最大 + * 给定一个数组,对一个区间(区间内全部都是偶数)全部/2,使得整个数组和最大,求数组最大和。 + */ + public static void main(String[] args) { + + + + } + + public void xc(int[] nums) { + + // 前缀和 + int[] preSum = new int[nums.length + 1]; + for (int i = 1; i < nums.length; i++) { + preSum[i] = preSum[i - 1] + nums[i - 1]; + } + + int minLoc = 0; + + int left = 0; + int right = 0; + while (right < nums.length) { + + + right++; + } + + + } + + +} diff --git a/src/main/java/cn/whaifree/redo/redo_24_4_6/LeetCode11.java b/src/main/java/cn/whaifree/redo/redo_24_4_6/LeetCode11.java new file mode 100644 index 0000000..21fa75a --- /dev/null +++ b/src/main/java/cn/whaifree/redo/redo_24_4_6/LeetCode11.java @@ -0,0 +1,42 @@ +package cn.whaifree.redo.redo_24_4_6; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/4/6 12:35 + * @注释 + */ +public class LeetCode11 { + + @Test + public void test() { + Solution solution = new Solution(); + int[] height = {1,1}; + int i = solution.maxArea(height); + System.out.println(i); + } + + class Solution { + public int maxArea(int[] height) { + + // capacity = (right-left)*min(right,left) + // 移动短的,可能变大,不变,变小 + // 移动长的,只会变小 + int left = 0; + int right = height.length - 1; + int capacity = Integer.MIN_VALUE; + while (left < right) { + capacity = Math.max(capacity, (right - left) * Math.min(height[left], height[right])); + if (height[left] < height[right]) { + left++; + }else { + right--; + } + } + return capacity; + } + } + +}