解决leetcode第3509题.最大化交错和为K的子序列乘积

news2025/5/29 8:21:03

3509.最大化交错和为K的子序列乘积

难度:困难

问题描述:

给你一个整数数组nums和两个整数k与limit,你的任务是找到一个非空的子序列,满足以下条件:

它的交错和等于k。

在乘积不超过limit的前提下,最大化其所有数字的乘积。

返回满足条件的子序列的乘积。如果不存在这样的子序列,则返回-1。

子序列是指可以通过删除原数组中的某些(或不删除)元素并保持剩余元素顺序得到的新数组。

交错和是指一个从下标0开始的数组中,偶数下标的元素之和减去奇数下标的元素之和。

示例1:

输入:nums=[1,2,3],k=2,limit=10

输出:6

解释:

交错和为2的子序列有:

[1,2,3]

交错和:1-2+3=2

乘积:1*2*3=6

[2]

交错和:2

乘积:2

在limit内的最大乘积是6。

示例2:

输入:nums=[0,2,3],k=-5,limit=12

输出:-1

解释:

不存在交错和恰好为-5的子序列。

示例3:

输入:nums=[2,2,3,3],k=0,limit=9

输出:9

解释:

交错和为0的子序列包括:

[2,2]

交错和:2-2=0

乘积:2*2=4

[3,3]

交错和:3-3=0

乘积:3*3=9

[2,2,3,3]

交错和:2-2+3-3=0

乘积:2*2*3*3=36

子序列[2,2,3,3]虽然交错和为k且乘积最大,但36>9,超出limit。下一个最大且在limit范围内的乘积是9。

提示:

1<=nums.length<=150

0<=nums[i]<=12

-105<=k<=105

1<=limit<=5000

问题分析:

这个问题的关键是如何找出一个列表的所有子序列,又要用到递归的方法。在找出所有的子序列之后,遍历每一个子序列,计算其交错和及元素的乘积,检验其交错和是否等给定的k值,元素的乘积是否小于等于limit的值,最后将其中最大的元素乘积求出。

为此设计了这些函数:

计算交错和函数 get_interleaved_sum(a)

计算列表中元素乘积函数 get_product(a)

找到列表中所有元素的子序列函数  get_nonnull_subsequence(a)

从列表a中找出非空子序列的最大乘积函数 get_max_product_subsequence(a,k,limit)

程序如下:

#计算列表a的交错和并返回
def get_interleaved_sum(a):
    b=a[::2]
    c=a[1::2]
    return sum(b)-sum(c)

#计算列表a的元素乘积并返回
def get_product(a):
    s=1
    for i in a:
        s*=i
    return s

#找出列表a的所有子序列并返回
def get_nonnull_subsequence(a):
    n=len(a)
    if n==1:
        return [a]
    elif n==2:
        return [[a[0]],[a[1]],a]
    else:
        b=get_nonnull_subsequence(a[1:])
        d=[[a[0]]]
        d.extend(b)
        for i in b:
            c=[a[0]]+i
            d.append(c)
        d.sort(key=lambda x:(len(x),x))
        return d

#从列表a中找出具有最大乘积的非空子序列找返回
def get_max_product_subsequence(a,k,limit):
    a=get_nonnull_subsequence(a)
    print('生成的所有子序列:',a)
    s=0
    for i in a:
        print('子序列:',i)
        t=get_interleaved_sum(i)
        l=get_product(i)
        print(f'{i}的交错和为:{t},{i}的元素乘积为:{l}')
        if t==k and s<l<=limit:
            s=l
    return -1 if s==0 else s

#主程序
nums=eval(input('pls input nums='))
k=int(input('pls input k='))
limit=int(input('pls input limit='))
s=get_max_product_subsequence(nums,k,limit)
print(f'最大乘积为:{s}' if s!=-1 else '没有找出满足条件的子序列!')

运行实例一

pls input nums=[2,3,4,5]

pls input k=-2

pls input limit=130

生成的所有子序列: [[2], [3], [4], [5], [2, 3], [2, 4], [2, 5], [3, 4], [3, 5], [4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5], [2, 3, 4, 5]]

子序列: [2]

[2]的交错和为:2,[2]的元素乘积为:2

子序列: [3]

[3]的交错和为:3,[3]的元素乘积为:3

子序列: [4]

[4]的交错和为:4,[4]的元素乘积为:4

子序列: [5]

[5]的交错和为:5,[5]的元素乘积为:5

子序列: [2, 3]

[2, 3]的交错和为:-1,[2, 3]的元素乘积为:6

子序列: [2, 4]

[2, 4]的交错和为:-2,[2, 4]的元素乘积为:8

子序列: [2, 5]

[2, 5]的交错和为:-3,[2, 5]的元素乘积为:10

子序列: [3, 4]

[3, 4]的交错和为:-1,[3, 4]的元素乘积为:12

子序列: [3, 5]

[3, 5]的交错和为:-2,[3, 5]的元素乘积为:15

子序列: [4, 5]

[4, 5]的交错和为:-1,[4, 5]的元素乘积为:20

子序列: [2, 3, 4]

[2, 3, 4]的交错和为:3,[2, 3, 4]的元素乘积为:24

子序列: [2, 3, 5]

[2, 3, 5]的交错和为:4,[2, 3, 5]的元素乘积为:30

子序列: [2, 4, 5]

[2, 4, 5]的交错和为:3,[2, 4, 5]的元素乘积为:40

子序列: [3, 4, 5]

[3, 4, 5]的交错和为:4,[3, 4, 5]的元素乘积为:60

子序列: [2, 3, 4, 5]

[2, 3, 4, 5]的交错和为:-2,[2, 3, 4, 5]的元素乘积为:120

最大乘积为:120

运行实例二

pls input nums=[3,4,5]

pls input k=-1

pls input limit=20

生成的所有子序列: [[3], [4], [5], [3, 4], [3, 5], [4, 5], [3, 4, 5]]

子序列: [3]

[3]的交错和为:3,[3]的元素乘积为:3

子序列: [4]

[4]的交错和为:4,[4]的元素乘积为:4

子序列: [5]

[5]的交错和为:5,[5]的元素乘积为:5

子序列: [3, 4]

[3, 4]的交错和为:-1,[3, 4]的元素乘积为:12

子序列: [3, 5]

[3, 5]的交错和为:-2,[3, 5]的元素乘积为:15

子序列: [4, 5]

[4, 5]的交错和为:-1,[4, 5]的元素乘积为:20

子序列: [3, 4, 5]

[3, 4, 5]的交错和为:4,[3, 4, 5]的元素乘积为:60

最大乘积为:20

运行实例三

pls input nums=[5,7,9]

pls input k=6

pls input limit=20

生成的所有子序列: [[5], [7], [9], [5, 7], [5, 9], [7, 9], [5, 7, 9]]

子序列: [5]

[5]的交错和为:5,[5]的元素乘积为:5

子序列: [7]

[7]的交错和为:7,[7]的元素乘积为:7

子序列: [9]

[9]的交错和为:9,[9]的元素乘积为:9

子序列: [5, 7]

[5, 7]的交错和为:-2,[5, 7]的元素乘积为:35

子序列: [5, 9]

[5, 9]的交错和为:-4,[5, 9]的元素乘积为:45

子序列: [7, 9]

[7, 9]的交错和为:-2,[7, 9]的元素乘积为:63

子序列: [5, 7, 9]

[5, 7, 9]的交错和为:7,[5, 7, 9]的元素乘积为:315

没有找出满足条件的子序列!

运行实例四

pls input nums=[6]

pls input k=6

pls input limit=30

生成的所有子序列: [[6]]

子序列: [6]

[6]的交错和为:6,[6]的元素乘积为:6

最大乘积为:6

在leetcode的问题中,涉及到排列组合问题的解决,主要包括这样一些:

  1. 求一个列表的全排列问题
  2. 求一个列表的所有子数组问题
  3. 求一个列表n个元素中任取m个元素组成全排列的问题
  4. 求一个列表所有子序列的问题

这些问题的解决基本上都用到了递归的方法,反复研究其解决过程,能够更深刻领会递归原理和对列表的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2387178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python 深度学习】1D~3D iou计算

一维iou 二维 import numpy as npdef iou_1d(set_a, set_b):# 获得集合A和B的边界 x1, x2 set_ay1, y2 set_b# 计算交集的上下界low max(x1,y1)high - min(x2, y2)# 计算交集if high - low < 0:inter 0else:inter high - low# 计算并集union (x2 -x1) (y2 - y1) - in…

java23

1.美化界面 添加背景图片 所以我们添加背景图片要放在后面添加 添加图片边框 绝对路径&#xff1a; 相对(模块)路径&#xff1a; 第一个是绝对路径&#xff0c;第二个是相对路径&#xff0c;但是斜杠的方向不对 总结&#xff1a; 2.图片移动 先实现KeyListener接口&#xf…

LitCTF2025 WEB

星愿信箱 使用的是python&#xff0c;那么大概率是ssti注入 测试{{5*5}} 发现需要包含文字&#xff0c;那么添加文字 可以看到被waf过滤了&#xff0c;直接抓包查看参数上fenjing 可以看到这里是json格式&#xff0c;其实fenjing也是支持json格式的 https://github.com/Marv…

Linux 下VS Code 的使用

这里以创建helloworld 为例。 Step 0:准备工作&#xff1a; Install Visual Studio Code. Install the C extension for VS Code. You can install the C/C extension by searching for c in the Extensions view (CtrlShiftX). Step 1: 创建工作目录 helloworld&#xff0…

Qt 布局管理器的层级关系

1、HomeWidget.h头文件&#xff1a; #ifndef HOMEWIDGET_H #define HOMEWIDGET_H#include <QWidget> #include <QPushButton> #include <QVBoxLayout> #include <QHBoxLayout>class HomeWidget : public QWidget {Q_OBJECTpublic:HomeWidget(QWidget …

maven模块化开发

使用方法 将项目安装到本地仓库 mvn install 的作用 运行 mvn install 时&#xff0c;Maven 会执行项目的整个构建生命周期&#xff08;包括 compile、test、package 等阶段&#xff09;&#xff0c;最终将构建的 artifact 安装到本地仓库&#xff08;默认路径为 ~/.m2/repos…

云原生安全之网络IP协议:从基础到实践指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 IP协议&#xff08;Internet Protocol&#xff09;是互联网通信的核心协议族之一&#xff0c;负责在设备间传递数据包。其核心特性包括&…

C++——QT 文件操作类

QFile 概述 QFile是Qt框架中用于文件操作的类&#xff08;位于QtCore模块&#xff09;&#xff0c;继承自 QIODevice&#xff0c;提供文件的读写、状态查询和路径管理功能。它与 QTextStream、QDataStream 配合使用&#xff0c;可简化文本和二进制数据的处理&#xff0c;并具备…

[spring] spring 框架、IOC和AOP思想

目录 传统Javaweb开发的困惑 loC、DI和AOP思想提出 Spring框架的诞生 传统Javaweb开发的困惑 问题一&#xff1a;层与层之间紧密耦合在了一起&#xff0c;接口与具体实现紧密耦合在了一起 解决思路&#xff1a;程序代码中不要手动new对象&#xff0c;第三方根据要求为程序提…

尚硅谷redis7 37-39 redis持久化之AOF简介

37 redis持久化之AOF简介 AOF 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工…

GitLab 备份所有仓库(自动克隆)

一、准备工作 1. 环境要求 已安装 Git&#xff08;版本 2.10&#xff09;本地磁盘空间充足&#xff08;根据仓库总大小预估&#xff09;已配置 SSH 密钥到 GitLab&#xff08;推荐方式&#xff09; 2. 获取 GitLab API 访问权限 登录 GitLab&#xff0c;点击右上角头像 → …

[浏览器]缓存策略机制详解

在做页面性能优化的时候&#xff0c;有一个点容易被忽略&#xff0c;那就是资源缓存优化。 浏览器里缓存策略分为强缓存&#xff0c;协商缓存以及不缓存&#xff0c;每个缓存策略都有其适用的优化场景。 下面为大家详解何为强缓存&#xff0c;协商缓存 先说结论强缓>协商&g…

OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模块中的一个工厂函数&#xff0c;用于创建一个计算图像导数的滤波器。这个滤波器可以用来计算图像…

AWS関連職種向け:日本語面接QA集

1. 自己紹介&#xff08;じこしょうかい&#xff09; Q&#xff1a;簡単に自己紹介をお願いします。 A&#xff1a; はい、〇〇と申します。これまで約4年間、主にAWSを基盤としたインフラ設計・構築・運用に従事してまいりました。VPCやEC2、RDS、S3などの基本サービスの設計…

(01)华为GaussDB((基于PostgreSQL))高斯数据库使用记录,dbeaver客户端配置高斯驱动,连接高斯数据库

高斯数据库是华为推出的一款基于PostgreSQL的企业级数据库产品&#xff0c;客户端使用通用的dbeaver dbeaver客户端配置高斯驱动 建议使用 dbeaver24.3.1及以上客户端&#xff0c;选择模式后执行sql会绑定模式名&#xff0c;如果使用dbeaver23.2版本&#xff0c;选择模式后执…

ARM Linux远程调试

准备 虚拟机既能ping通开发板,又能ping通外网,还要能ping通Windows主机(如果你有上位机通信(tftp、vsftp、ssh)的需求) VMware 添加网络适配器2用作桥接网卡,原有的网络适配器保持为NAT模式 打开虚拟网络编辑器,配置VMnet0为桥接模式,外部连接设置为Realtek PCIe G…

day24Node-node的Web框架Express

1. Express 基础 1.1 什么是Express node的web框架有Express 和 Koa。常用Express 。 Express 是一个基于 Node.js 的快速、极简的 Web 应用框架,用于构建 服务器端应用(如网站后端、RESTful API 等)。它是 Node.js 生态中最流行的框架之一,以轻量、灵活和易用著称。 …

让MySQL更快:EXPLAIN语句详尽解析

前言 在数据库性能调优中&#xff0c;SQL 查询的执行效率是影响系统整体性能的关键因素之一。MySQL 提供了强大的工具——EXPLAIN 语句&#xff0c;帮助开发者和数据库管理员深入分析查询的执行计划&#xff0c;从而发现潜在的性能瓶颈并进行针对性优化。 EXPLAIN 语句能够模…

[CSS3]rem移动适配

前言 什么是移动端适配? 让页面的元素在屏幕尺寸变化时, 同比放大或缩小 移动适配的方案 rem&#xff1a;目前多数企业在用的解决方案 vw/vh&#xff1a;未来的解决方案 rem 体验rem适配 目标: 能够使用rem单位设置网页元素的尺寸 网页效果: 屏幕宽度不同&#xff0c;网…

向量数据库及ChromaDB的使用

什么是向量数据库&#xff1f; 向量数据库&#xff08;Vector Database&#xff09;&#xff0c;也叫矢量数据库&#xff0c;主要用来存储和处理向量数据。 在数学中&#xff0c;向量是有大小和方向的量&#xff0c;可以使用带箭头的线段表示&#xff0c;箭头指向即为向量的方…