2600. K 件物品的最大和-简单
题目描述:
袋子中装有一些物品,每个物品上都标记着数字 1 、0 或 -1 。
给你四个非负整数 numOnes 、numZeros 、numNegOnes 和 k 。
袋子最初包含:
numOnes 件标记为 1 的物品。
numZeroes 件标记为 0 的物品。
numNegOnes 件标记为 -1 的物品。
现计划从这些物品中恰好选出 k 件物品。返回所有可行方案中,物品上所标记数字之和的最大值。
题解:
没啥说的,ifelse搞定
代码(Go):
func kItemsWithMaximumSum(numOnes int, numZeros int, numNegOnes int, k int) int {
if k <= numOnes{
return k
}else if k - numOnes <= numZeros{
return numOnes
}else{
return 2 * numOnes + numZeros - k
}
}
1556. 千位分隔数-简单
题目描述:
给你一个整数 n,请你每隔三位添加点(即 “.” 符号)作为千位分隔符,并将结果以字符串格式返回。
题解:
主要就是处理一下开头不能加点,不满3位的先从头部提出来,剩下就每3位加一次点即可
代码(Go):
func thousandSeparator(n int) string {
s := strconv.Itoa(n)
var re string
flag := len(s)%3
if flag != 0{
re += s[:flag]
s = s[flag:]
}else{
if len(s) == 3{
return s
}
re += s[:3]
s = s[3:]
}
for i := len(s)/3;i > 0;i--{
re += "."
re += s[:3]
s = s[3:]
}
return re
}
377. 组合总和 Ⅳ-中等
题目描述:
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
题解:
常规背包问题,两层循环解决,代码都一个套路
代码(Go):
func combinationSum4(nums []int, target int) int {
dp := make([]int,target + 1)
dp[0] = 1
for i := 1;i <= target;i++{
for j := 0;j < len(nums);j++{
if i >= nums[j]{
dp[i] += dp[i - nums[j]]
}
}
}
return dp[target]
}
96. 不同的二叉搜索树-中等
题目描述:
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
题解:
计算每一个节点位根时左右子树的数量相乘即为该节点为根的数量,遍历n个节点的情况并相加即可得到n个节点的二叉搜索树数量
代码(Go)
func numTrees(n int) int {
dp := make([]int,n + 1)
dp[0] = 1
dp[1] = 1
for i := 2;i <= n;i++{
for j := 1;j <= i;j++{
dp[i] += dp[i - j] * dp[j - 1]
}
}
return dp[n]
}
总结
这四道题是补昨天的,昨天太忙了没空做。今天把基础篇里的背包问题做完了,一维的背包问题还是挺简单的,比较好想,遇到二维就需要想一下了,三维动态规划我大脑直接宕机。接下来是树动态规划,最后就是我觉得最难的字符串动态规划