当前位置: 首页 > article >正文

蓝桥杯思维训练(五)

文章目录

  • 子集II
  • 1191.K次串联后最大子数组之和

子集II

子集II

在这里插入图片描述

在这里插入图片描述

思路分析: 求解子集的问题的关键就是,通过递归与回溯,我们就是得确定以某个元素开始的子集,对于这个题目来说,比较麻烦的一点就是,存在重复的元素,这样如果不增加一个判断的话,会导致我们的结果存在重复的元素

如何消除重复的情况?

nums.sort()  # 排序,方便去重
# 在这个for 训练里面,我们是用于选择子集的开始的元素的,只要我们开始的元素没有和前一个元素相同,那么就可以进行递归增加元素
if i > start and nums[i] == nums[i-1]:
                    continue

整体的代码中,我们使用ans 来记录全部的子集,path来记录当前的元素的情况

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()  # 排序,方便去重
        ans = []
        path = []
        def backtrack(start):
            ans.append(path[:])  # 添加当前子集到结果中
            for i in range(start, len(nums)):
                # 跳过重复元素
                if i > start and nums[i] == nums[i-1]:
                    continue
                path.append(nums[i])  # 选择当前元素
                backtrack(i + 1)  # 递归
                path.pop()  # 撤销选择
        backtrack(0)
        return ans

1191.K次串联后最大子数组之和

1191.K次串联后最大子数组之和

在这里插入图片描述
在这里插入图片描述

思路分析:由于k和arr数组长度都很长,所以不可能全部拼接起来,所以说就根本不用全部拼接起来
规律:当k=1的时候,就是正常算,如果K>=2的时候,我们可以先拼接两个进行正常运算,如果max(dp) 小于等于0,则返回0,然后我们思考这两段之间能否插入剩余的段,所以我们计算sum(arr),如果sum(arr)>0,就可以拼接在两段之间,否则就直接返回两段的情况,记得要取模再返回

class Solution:
    def kConcatenationMaxSum(self, arr: List[int], k: int) -> int:
        # 肯定是不能直接拼接上去再dp的不然,o(n)的时间复杂度也到了10^10,所以还是在之前的数组arr操作
        #
        n = len(arr)
        ans = 0
        if k == 1:
            dp = [0]*n
            dp[0] = arr[0]
            for i in range(1,n):
                dp[i] = max(dp[i-1]+arr[i],arr[i])
            # 判断ans,如果小于等于0,就返回0,否则就是取模返回
            ans = max(dp)
            return ans%(10**9+7) if ans >0 else 0

        else:
            dp = [0]*(2*n)
            dp[0] = arr[0]
            # 拼接
            nums = arr + arr
            for i in range(1,2*n):
                dp[i] = max(dp[i-1]+nums[i],nums[i])
            # 查看最大值
            ans = max(dp)
            # 小于等于0就返回
            if ans<=0:
                return 0
            sumarr = sum(arr)
            # 看看能否插入其中
            if sumarr>0:
                return (ans+(k-2)*sumarr)%(10**9+7)
            else:
                return ans%(10**9+7)


http://www.kler.cn/a/533826.html

相关文章:

  • Immutable设计 SimpleDateFormat DateTimeFormatter
  • w193基于Spring Boot的秒杀系统设计与实现
  • 《redis哨兵机制》
  • 【人工智能】通用人工智能 AGI
  • 【MySQL】MySQL经典面试题深度解析
  • DeepSeek 的含金量还在上升
  • 【Day31 LeetCode】动态规划DP Ⅳ
  • 在深度学习中,样本不均衡问题是一个常见的挑战,尤其是在你的老虎机任务中,某些的中奖倍数较高
  • 网络安全-设备安全加固
  • 【前端】【Ts】【知识点总结】TypeScript知识总结
  • 使用DeepSeek R1 + 了解部署
  • 从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)
  • 【蓝桥杯嵌入式】工程创建
  • MapStruct工具类的使用
  • [论文笔记] Deepseek技术报告
  • 【Elasticsearch】`auto_date_histogram`聚合功能详解
  • MLA 架构
  • Ubuntu部署Deepseek-R1模型(8b)
  • 基于微信小程序的医院综合服务平台的设计与实现ssm+论文源码调试
  • 亚博microros小车-原生ubuntu支持系列:22 物体识别追踪
  • AI绘画:解锁商业设计新宇宙(6/10)
  • 使用request库实现接口测试-笔记
  • 阿里云 ubuntu22.04 中国区节点安装 Docker
  • 2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试
  • arm 下 多线程访问同一变量 ,使用原子操作 性能差问题
  • 【Git】二、分支管理详解