LeetCode 解题思路 45(分割等和子集、最长有效括号)

解题思路:

  1. dp 数组的含义: 在数组中是否存在一个子集,其和为 i。
  2. 递推公式: dp[i] |= dp[i - num]。
  3. dp 数组初始化: dp[0] = true。
  4. 遍历顺序: 从大到小去遍历,从 i = target 开始,直到 i = num。确保每个数只用一次。
  5. 打印 dp 数组

Java代码:

java 复制代码
class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for (int num : nums)
            sum += num;
        if (sum % 2 != 0)
            return false;
        int target = sum / 2;

        boolean[] dp = new boolean[target + 1];
        dp[0] = true;
        for (int num : nums) {
            for (int i = target; i >= num; i--) {
                dp[i] |= dp[i - num];
            }
        }
        return dp[target];
    }
}

复杂度分析:

  • 时间复杂度: O(n * target)。
  • 空间复杂度: O(target)。

解题思路:

可以使用栈来解决这个问题。核心思想是利用栈来跟踪未匹配的括号的索引。初始化时,栈中压入一个基准索引 -1,用于后续计算有效子串的长度。遍历字符串时:

  • 遇到左括号 '(',将其索引压入栈中。
  • 遇到右括号 ')',弹出栈顶元素。此时:
  • 若栈为空,说明当前右括号无匹配,将当前索引压入栈作为新基准。
  • 若栈不为空,当前有效子串长度为当前索引与栈顶元素的差值,更新最大值。

此方法确保每次弹出栈顶后,栈顶元素即为最近未匹配的左括号或基准点,从而快速计算有效长度。

Java代码:

java 复制代码
public class Solution {
    public int longestValidParentheses(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(-1);
        int maxLen = 0;
        
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(') {
                stack.push(i);
            } else {
                stack.pop();
                if (stack.isEmpty()) {
                    stack.push(i);
                } else {
                    maxLen = Math.max(maxLen, i - stack.peek());
                }
            }
        }
        return maxLen;
    }
}

复杂度分析:

  • 时间复杂度: O(n)。
  • 空间复杂度: O(n)。
相关推荐
yyy(十一月限定版)27 分钟前
寒假集训4——二分排序
算法
星火开发设计27 分钟前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
醉颜凉38 分钟前
【LeetCode】打家劫舍III
c语言·算法·leetcode·树 深度优先搜索·动态规划 二叉树
达文汐41 分钟前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
一匹电信狗41 分钟前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl
User_芊芊君子41 分钟前
【LeetCode经典题解】搞定二叉树最近公共祖先:递归法+栈存路径法,附代码实现
算法·leetcode·职场和发展
培风图南以星河揽胜42 分钟前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
算法_小学生43 分钟前
LeetCode 热题 100(分享最简单易懂的Python代码!)
python·算法·leetcode
执着25943 分钟前
力扣hot100 - 234、回文链表
算法·leetcode·链表
Gorgous—l44 分钟前
数据结构算法学习:LeetCode热题100-多维动态规划篇(不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离)
数据结构·学习·算法