初学python记录:力扣377. 组合总和 Ⅳ

题目:

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 1000
  • nums 中的所有元素 互不相同
  • 1 <= target <= 1000

思考:

又是前两天的题目的姊妹题,一开始试图用类似的方法写代码,如下:

python 复制代码
class Solution(object):
    def combinationSum4(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        n = len(nums)

        def makeTree(target, nums):
            if target < 0:
                return 0
            elif target == 0:
                return 1
            else:
                ans = 0
                for index in range(0, n):
                    ans += makeTree(target - nums[index], nums)
                return ans

        return makeTree(target, nums)

虽然是对的,但是超时了:

思考了一下,发现这道题可以用动态规划做。

优化:动态规划:

用dpi表示和为i的组合个数,i的范围是nums的最小值, target,最终dptarget即为题目所求,算法如下:

  1. 将nums数组从小到大排序,若 nums的最小值 > target,直接返回0;
  2. 将dp数组初始化为全0;
  3. 和为 nums的最小值(即nums0)的组合个数一定只有1个,所以dpnums\[0]初始化为1;
  4. 对每个i,遍历nums中的元素j,,此处注意判断i和j的大小关系(若j>i,当前dpi计算完毕,进行下一个i的计算;若j=i,说明有一个组合是只含一个元素j的,dpi加一;若j<i,则dpi += dpi-j
  5. 返回dptarget的值

代码如下:

python 复制代码
class Solution(object):
    def combinationSum4(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        n = len(nums)
        nums.sort()
        if target < nums[0]:
            return 0
        dp = [0 for _ in range(target+1)]
        dp[nums[0]] = 1
        for i in range(nums[0]+1, target+1):
            for j in nums:
                if j > i:
                    break
                elif j == i:
                    dp[i] += 1
                else:
                    dp[i] += dp[i-j]
        return dp[target]

提交通过:

相关推荐
风吹夏回11 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
kkeeper~11 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
小熊Coding11 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋911 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
田里的水稻12 小时前
OE_ubuntu26.04与宿主机之间复制粘贴内容
人工智能·python·机器人
wabs66612 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_8769641312 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
jiayong2313 小时前
02 创建虚拟环境
python
旺仔来了13 小时前
不联网的Linux下部署python环境
linux·开发语言·python