2024/9/26 Hot100 dp结束,以及今日的每日一题
This commit is contained in:
parent
3a82396c07
commit
a5035ff16f
|
@ -0,0 +1,70 @@
|
||||||
|
package com.cool.hot100.dp;
|
||||||
|
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created with IntelliJ IDEA.
|
||||||
|
*
|
||||||
|
* @Author: Cool
|
||||||
|
* @Date: 2024/09/26/13:53
|
||||||
|
* DayNumber 3
|
||||||
|
* Hard 3
|
||||||
|
* Level 7
|
||||||
|
* @Description 32. 最长有效括号
|
||||||
|
* @Link https://leetcode.cn/problems/longest-valid-parentheses/description/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
*/
|
||||||
|
public class Num31 {
|
||||||
|
/**
|
||||||
|
* 栈解法
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int longestValidParentheses(String s) {
|
||||||
|
Stack<Integer> stack = new Stack<>();
|
||||||
|
int res = 0;
|
||||||
|
stack.push(-1);
|
||||||
|
for (int i = 0; i < s.length(); i++) {
|
||||||
|
if (s.charAt(i) == '(') {
|
||||||
|
stack.push(i);
|
||||||
|
} else {
|
||||||
|
stack.pop();
|
||||||
|
if (stack.empty()) {
|
||||||
|
stack.push(i);
|
||||||
|
} else {
|
||||||
|
res = Math.max(res, i - stack.peek());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动态规划解法
|
||||||
|
* @param s
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int longestValidParentheses2(String s) {
|
||||||
|
int max = 0;
|
||||||
|
s = "a " + s;
|
||||||
|
int[] dp = new int[s.length()];
|
||||||
|
for (int i = 2; i < s.length(); i++) {
|
||||||
|
if (s.charAt(i) == ')') {
|
||||||
|
//s.charAt(i - dp[i - 1] - 1) == '('是在校验当前已组成有效括号的前一个括号是否为(,
|
||||||
|
max = Math.max(max, dp[i]);
|
||||||
|
if (s.charAt(i - 1) == ')') {
|
||||||
|
if (s.charAt(i - dp[i - 1] - 1) == '(') {
|
||||||
|
dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2];
|
||||||
|
}
|
||||||
|
} else if (s.charAt(i - dp[i - 1] - 1) == '(') {
|
||||||
|
/*i-2-dp[i-1]为当前已经组成有效括号的前一个括号,这里的有效括号与
|
||||||
|
上面的有效括号不同,这里是算上当前括号的有效括号,用来应对()(())这样的数据*/
|
||||||
|
dp[i] = dp[i - 2 - dp[i - 1]] + 2 + dp[i - 1];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.cool.hot100.dp;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created with IntelliJ IDEA.
|
||||||
|
*
|
||||||
|
* @Author: Cool
|
||||||
|
* @Date: 2024/09/26/09:31
|
||||||
|
* DayNumber 1
|
||||||
|
* Hard 2
|
||||||
|
* Level ?
|
||||||
|
* @Description 416. 分割等和子集
|
||||||
|
* @Link https://leetcode.cn/problems/partition-equal-subset-sum/description/?envType=study-plan-v2&envId=top-100-liked
|
||||||
|
*/
|
||||||
|
public class Num416 {
|
||||||
|
public boolean canPartition(int[] nums) {
|
||||||
|
int average = 0;
|
||||||
|
for (int num : nums) {
|
||||||
|
average += num;
|
||||||
|
}
|
||||||
|
if ((average & 1) == 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
average = average / 2;
|
||||||
|
boolean[] dp = new boolean[average + 1];
|
||||||
|
if (nums[0] <= average) {
|
||||||
|
dp[nums[0]] = true;
|
||||||
|
}
|
||||||
|
for (int i = 1; i < nums.length; i++) {
|
||||||
|
for (int j = average; nums[i] <= j; j--) {
|
||||||
|
dp[j] = dp[j] || dp[j - nums[i]];
|
||||||
|
if (dp[average]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[average];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test(){
|
||||||
|
canPartition(new int[]{1,2,5});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.cool.one_question_per_day;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created with IntelliJ IDEA.
|
||||||
|
*
|
||||||
|
* @Author: Cool
|
||||||
|
* @Date: 2024/09/26/11:33
|
||||||
|
* DayNumber 2
|
||||||
|
* Hard 1
|
||||||
|
* Level ?
|
||||||
|
* @Description 2535. 数组元素和与数字和的绝对差
|
||||||
|
* @Link https://leetcode.cn/problems/difference-between-element-sum-and-digit-sum-of-an-array/description/?envType=daily-question&envId=2024-09-26
|
||||||
|
*/
|
||||||
|
public class LeetCode20240926 {
|
||||||
|
public int differenceOfSum(int[] nums) {
|
||||||
|
int sum=0;
|
||||||
|
int sum1=0;
|
||||||
|
for(int num:nums){
|
||||||
|
sum+=num;
|
||||||
|
while(num!=0){
|
||||||
|
sum1+=num%10;
|
||||||
|
num=num/10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Math.abs(sum1-sum);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue