【每日力扣】32. 最长有效括号 416. 分割等和子集

news/2025/2/14 8:14:12/

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害

32. 最长有效括号

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号

子串

的长度。

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

解题思路

这个问题可以使用栈来解决。具体思路如下:

  1. 使用栈来存储括号的下标。
  2. 初始化栈并将-1入栈(用于处理特殊情况)。
  3. 遍历字符串,对于每个字符:
    • 如果遇到左括号’(',将其下标入栈。
    • 如果遇到右括号’)',弹出栈顶元素(即栈中最后一个可以构成有效括号匹配的下标),并计算当前位置到上一个可以构成有效括号匹配的下标之间的距离,更新最长有效括号的长度。
  4. 返回最长有效括号的长度。

代码实现

import java.util.Stack;class Solution {public int longestValidParentheses(String s) {int maxLength = 0;Stack<Integer> stack = new Stack<>();stack.push(-1); // 初始放入-1,用于处理特殊情况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 {maxLength = Math.max(maxLength, i - stack.peek());}}}return maxLength;}
}

416. 分割等和子集

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

解题思路

  1. 计算整个数组的元素和 total
  2. 如果 total 是奇数,直接返回 false,因为无法平分奇数的总和。
  3. 将问题转化为在数组中寻找一个子集,使其和等于 total / 2,也就是寻找一个子集的和等于总和的一半,在背包问题中可以看作是背包容量为 total / 2 的背包能否恰好装满。
  4. 使用动态规划解决背包问题,创建一个布尔类型的二维数组 dp,其中 dp[i][j] 表示在前 i 个元素中能否凑出和为 j
  5. 动态规划状态转移方程为 dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i - 1]],即当前元素可以选择放入或不放入背包。
  6. 最后返回 dp[nums.length][total / 2] 的值。

代码实现

class Solution {public boolean canPartition(int[] nums) {int total = 0;for (int num : nums) {total += num;}if (total % 2 != 0) {return false;}int target = total / 2;boolean[][] dp = new boolean[nums.length + 1][target + 1];dp[0][0] = true;for (int i = 1; i <= nums.length; i++) {dp[i][0] = true; // 可以凑出和为0for (int j = 1; j <= target; j++) {if (j >= nums[i - 1]) {dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i - 1]];} else {dp[i][j] = dp[i - 1][j];}}}return dp[nums.length][target];}
}

http://www.ppmy.cn/news/1465684.html

相关文章

vue-table的使用,解决懒加载展开列,数据量过大,造成的卡顿问题

场景 有需求&#xff0c;使用懒加载的展开列&#xff0c;当加载的数据量过大&#xff0c;如大于1000条以上&#xff0c;浏览器可能卡死挂了 分析 大量的dom的渲染绘制&#xff0c;导致了浏览器处理不过来 解决 虚拟列表 vue-table 虚拟列表的使用 vue-table官网 <vx…

python上位机串行通信接收字节数据的校验处理-以crc16-modbus为例

在串行通信中&#xff0c;接收到的数据是否正确&#xff0c;一般用CRC校码的方式来完成。上位机向下位机发送数据时&#xff0c;需要加上校验码&#xff0c;同理&#xff0c;下位机向上位机上报数据时&#xff0c;也需要加上校验码。 校验码的计算方法有很多&#xff0c;比较简…

Kotlin 数据类

文章目录 定义编译器自动重写、生成方法 定义 Kotlin 数据类可以用于存储数据&#xff08;当然&#xff0c;不是说普通类不行&#xff09;。数据类使用data class定义&#xff1a; data class Book(val name: String, val author: String)数据类必须有主构造方法&#xff0c;…

Linux服务器安装anaconda、配置pytorch环境

Linux服务器安装anaconda并配置pytorch环境 Linux服务器安装anaconda下载anaconda安装anaconda验证是否安装成功注意默认python版本 配置pytorch环境新建虚拟环境安装pytorch Linux服务器安装anaconda 下载anaconda 首先进入anaconda网站&#xff0c;根据自己的需要选择一个版…

奇安信_NAC终端安全准入系统(相关问题整理)

奇安信终端安全准入系统 ,下称NAC 一、入网控制方式 1.IP流量控制 2.802.1X 准入 需要NAC、交换机、终端 以802.1X 3.DHCP 准入 将NAC作为DHCP服务器&#xff0c;为客户端分配地址&#xff0c;并对分配地址的客户端进行入网管控。 &#xff08;*&#xff09;可选 强制入网…

深入理解Vue 3:计算属性与侦听器的艺术

title: 深入理解Vue 3&#xff1a;计算属性与侦听器的艺术 date: 2024/5/30 下午3:53:47 updated: 2024/5/30 下午3:53:47 categories: 前端开发 tags: Vue3计算属性侦听器路由模板性能优化实战案例 前言 Vue 3的新特性简介 Vue.js作为当今流行的前端框架之一&#xff0c;…

WordPress plugin MStore API SQL注入漏洞复现(CVE-2023-3077)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress plugin MStore API 3.9.8 版本之前存在S…

GPT-4o:人工智能新时代的先锋

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方向一&#xff1a;对比分析 提…