从零开始的力扣刷题记录-第七十七天

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]
}

总结

这四道题是补昨天的,昨天太忙了没空做。今天把基础篇里的背包问题做完了,一维的背包问题还是挺简单的,比较好想,遇到二维就需要想一下了,三维动态规划我大脑直接宕机。接下来是树动态规划,最后就是我觉得最难的字符串动态规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题,使用 lambda 表达式可以简化代码,例如在 sort 函数自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 的 priority_queue:priority_queue 是 STL 的一个容器,可以用来实现堆。在力扣刷题,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 的 unordered_map:unordered_map 是 STL 的一个容器,可以用来实现哈希表。在力扣刷题,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 的 string:string 是 STL 的一个容器,可以用来存储字符串。在力扣刷题,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值