LeetCode算法题(Go语言实现)_51

news2025/5/20 7:15:30

题目

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,两者长度都是 n ,再给你一个正整数 k 。你必须从 nums1 中选一个长度为 k 的 子序列 对应的下标。
对于选择的下标 i0 ,i1 ,…, ik - 1 ,你的 分数 定义如下:
nums1 中下标对应元素求和,乘以 nums2 中下标对应元素的 最小值 。
用公式表示: (nums1[i0] + nums1[i1] +…+ nums1[ik - 1]) * min(nums2[i0] , nums2[i1], … ,nums2[ik - 1]) 。
请你返回 最大 可能的分数。
一个数组的 子序列 下标是集合 {0, 1, …, n-1} 中删除若干元素得到的剩余集合,也可以不删除任何元素。

一、代码实现(贪心+优先队列)

import (
	"container/heap"
	"sort"
)

func maxScore(nums1 []int, nums2 []int, k int) int64 {
	n := len(nums1)
	pairs := make([][]int, n)
	for i := 0; i < n; i++ {
		pairs[i] = []int{nums2[i], nums1[i]}
	}
	sort.Slice(pairs, func(i, j int) bool {
		return pairs[i][0] > pairs[j][0]
	})

	h := &minHeap{}
	heap.Init(h)
	total := 0
	maxScore := 0

	for _, pair := range pairs {
		num2, num1 := pair[0], pair[1]
		heap.Push(h, num1)
		total += num1
		if h.Len() > k {
			total -= heap.Pop(h).(int)
		}
		if h.Len() == k {
			current := total * num2
			if current > maxScore {
				maxScore = current
			}
		}
	}
	return int64(maxScore)
}

type minHeap []int

func (h minHeap) Len() int            { return len(h) }
func (h minHeap) Less(i, j int) bool  { return h[i] < h[j] }
func (h minHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *minHeap) Push(x interface{}) { *h = append(*h, x.(int)) }
func (h *minHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[:n-1]
	return x
}

二、算法分析

1. 核心思路
  • 排序策略:将元素按nums2的值降序排列,确保每次处理当前可能的子序列最小值。
  • 贪心选择:维护一个最小堆,动态保留当前最大的knums1值。
  • 实时计算:当堆满k个元素时,立即计算当前可能的最大分数。
2. 关键步骤
  1. 数据预处理

    • nums1nums2的元素配对并按nums2降序排列。
  2. 堆维护过程

    • 使用最小堆动态维护最大的knums1值。
    • 每当堆元素超过k时,弹出最小值以保持堆大小。
  3. 分数计算

    • 每次堆满k个元素时,计算当前和与当前nums2最小值的乘积,更新最大分数。
3. 复杂度
指标说明
时间复杂度O(n log n)排序主导时间复杂度
空间复杂度O(n)存储排序后的元素对

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 全相同元素:当所有nums2值相同时,正确选取最大的knums1值。
  • k等于数组长度:此时必须全选,分数为总和乘以最小值。
  • 大数值测试:验证算法在极大数值时的正确性。
2. 扩展应用
  • 动态k值调整:支持k值根据条件变化时快速重新计算。
  • 多维约束:增加其他维度的限制条件进行筛选。
  • 分布式计算:处理超大规模数据时分布式排序和堆维护。
3. 多语言实现
import java.util.*;

public class Solution {
    public int maxScore(int[] nums1, int[] nums2, int k) {
        int n = nums1.length;
        int[][] pairs = new int[n][2];
        for (int i = 0; i < n; i++) {
            pairs[i][0] = nums2[i];
            pairs[i][1] = nums1[i];
        }
        Arrays.sort(pairs, (a, b) -> b[0] - a[0]);
        
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        long total = 0;
        long maxScore = 0;
        
        for (int[] pair : pairs) {
            int num2 = pair[0];
            int num1 = pair[1];
            heap.offer(num1);
            total += num1;
            if (heap.size() > k) {
                total -= heap.poll();
            }
            if (heap.size() == k) {
                maxScore = Math.max(maxScore, total * num2);
            }
        }
        
        return (int) maxScore;
    }
}
import heapq

def maxScore(nums1, nums2, k):
    # 将nums2和nums1的元素配对,并按nums2的值降序排列
    pairs = sorted(zip(nums2, nums1), key=lambda x: -x[0])
    
    heap = []
    total = 0
    max_score = 0
    
    for num2, num1 in pairs:
        # 将当前nums1的值加入堆
        heapq.heappush(heap, num1)
        total += num1
        
        # 如果堆的大小超过k,弹出最小的元素
        if len(heap) > k:
            removed = heapq.heappop(heap)
            total -= removed
        
        # 当堆中恰好有k个元素时,计算当前分数
        if len(heap) == k:
            current_score = total * num2
            if current_score > max_score:
                max_score = current_score
    
    return max_score

五、总结与优化

1. 算法对比
方法优势适用场景
贪心+优先队列时间效率高需要动态维护最大值
暴力枚举实现简单小规模数据
动态规划可处理复杂约束需要状态转移的情况
2. 工程优化
  • 内存优化:在原数组上操作减少内存消耗。
  • 并行排序:使用多线程加速大规模数据排序。
  • 剪枝策略:提前终止不可能产生更优解的分支。
3. 扩展方向
  • 在线处理:支持数据流动态添加元素。
  • 多目标优化:同时考虑多个目标函数的最优解。
  • 近似算法:针对超大数据设计近似解法。

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

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

相关文章

Solon AI MCP Server 入门:Helloworld (支持 java8 到 java24。国产解决方案)

目前网上能看到的 MCP Server 基本上都是基于 Python 或者 nodejs &#xff0c;虽然也有 Java 版本的 MCP SDK&#xff0c;但是鲜有基于 Java 开发的。 作为Java 开发中的国产顶级框架 Solon 已经基于 MCP SDK 在进行 Solon AI MCP 框架开发了&#xff0c;本文将使用 Solon AI …

公司内部自建知识共享的方式分类、详细步骤及表格总结,分为开源(对外公开)和闭源(仅限内部),以及公共(全员可访问)和内部(特定团队/项目组)四个维度

以下是公司内部自建知识共享的方式分类、详细步骤及表格总结&#xff0c;分为开源&#xff08;对外公开&#xff09;和闭源&#xff08;仅限内部&#xff09;&#xff0c;以及公共&#xff08;全员可访问&#xff09;和内部&#xff08;特定团队/项目组&#xff09;四个维度&am…

Oracle 19c部署之初始化实例(三)

上一篇文章中&#xff0c;我们已经完成了数据库软件安装&#xff0c;接下来我们需要进行实例初始化工作。 一、初始化实例的两种方式 1.1 图形化初始化实例 描述&#xff1a;图形化初始化实例是通过Oracle的Database Configuration Assistant (DBCA)工具完成的。用户通过一系…

医疗设备预测性维护合规架构:从法规遵循到技术实现的深度解析

在医疗行业数字化转型加速推进的当下&#xff0c;医疗设备预测性维护已成为提升设备可用性、保障医疗安全的核心技术。然而&#xff0c;该技术的有效落地必须建立在严格的合规框架之上。医疗设备直接关乎患者生命健康&#xff0c;其维护过程涉及医疗法规、数据安全、质量管控等…

Openfeign的最佳实践

文章目录 问题引入一、继承的方式1. 建立独立的Moudle服务2. 服务调用方继承jar包中的接口3. 直接注入继承后的接口进行使用 二、抽取的方式1. 建立独立的Moudle服务2.服务调用方依赖注入 问题引入 openfeign接口的实现和服务提供方的controller非常相似&#xff0c;例如&…

Buildroot编译过程中下载源码失败

RK3588编译一下recovery&#xff0c;需要把buildroot源码编译一遍。遇到好几个文件都下载失败&#xff0c;如下所示 pm-utils 1.4.1这个包下载失败&#xff0c;下载地址http://pm-utils.freedesktop.org/releases 解决办法&#xff0c;换个网络用windows浏览器下载后&#xff…

OpenCV 图形API(43)颜色空间转换-----将 BGR 图像转换为 LUV 色彩空间函数BGR2LUV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为LUV色彩空间。 该函数将输入图像从BGR色彩空间转换为LUV。B、G和R通道值的传统范围是0到255。 输出图像必须是8位无符…

自问自答模式(Operation是什么)

自问自答 问&#xff1a;Operation 注解来自哪里&#xff1f; 答&#xff1a;Operation 是 OpenAPI&#xff08;Swagger&#xff09;规范中&#xff0c;来自 io.swagger.v3.oas.annotations 包的一个注解&#xff0c;用于给 REST 接口增加文档元数据。 问&#xff1a;summary …

996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容

996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容 获取 Input 内容测试NPC参考资料获取 Input 内容 测试NPC -- NPC入口函数 function main(player)local msg = [[<Img|id=9527|x=0|y=0|width=300|height=150|img=public/bg_npc_01.png|bg=1|move=1|reset=1|show=0|layer…

少数服从多数悖论、黑白颠倒与众人孤立现象之如何应对(一)

观己之前&#xff0c;也可先观众生 如果当时没有袖手旁观&#xff0c;或许唇不亡齿也不会寒 ■如何轻松/更好应对个别被众人孤立&#xff08;他人、辨别、自己&#xff09; ●他人被孤立 不参与 有余力&#xff0c;助弱者 被孤立者本身有问题 •不参与&#xff1a;不会辨…

leetcode0058. 最后一个单词的长度-easy

1 题目&#xff1a;最后一个单词的长度 官方标定难度&#xff1a;易 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#x…

新一代电子海图S-100标准

随着航海技术的不断发展&#xff0c;国际海事组织&#xff08;IMO&#xff09;和国际航道测量组织&#xff08;IHO&#xff09;不断推动电子海图标准的更新&#xff0c;以提高航行安全和效率。S-100标准作为新一代电子海图标准&#xff0c;为电子海图显示和信息系统&#xff08…

力扣热题100——普通数组(不普通)

普通数组但一点不普通&#xff01; 最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数 最大子数组和 这道题是非常经典的适用动态规划解决题目&#xff0c;但同时这里给出两种解法 动态规划、分治法 那么动态规划方法大家可以在我的另外一篇博客总结中看到&am…

深度学习与机器学习的关系解析:从基础到应用

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…

工业物联网的可视化编程革新:Node-RED与边缘计算的深度融合-纵横智控

在工业物联网的演进历程中&#xff0c;可视化编程工具正成为打破技术壁垒的核心力量。Node-RED作为开源的可视化编程平台&#xff0c;通过其独特的拖拽式逻辑构建能力&#xff0c;为设备连接、数据处理与业务逻辑设计提供了全新范式。本文将深入解析Node-RED的技术优势&#xf…

深度学习 从入门到精通 day_02

1. 自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。 1.1 基础概念 1. 张量 &#xff1a…

Linux通用一键换源脚本.sh - ubuntu、centos全自动更换国内源 - LinuxMirrors神器

效果 脚本 bash <(curl -sSL https://linuxmirrors.cn/main.sh) 来自 https://linuxmirrors.cn/ 截图 ending...

【Python学习笔记】Pandas实现Excel质检记录表初审、复核及质检统计

背景&#xff1a; 我有这样一个需要审核的飞书题目表&#xff0c;按日期分成多个sheet&#xff0c;有初审——复核——质检三个环节&#xff0c;这三个环节是不同的同学在作业&#xff0c;并且领到同一个题目的人选是随机的&#xff0c;也就是说&#xff0c;完成一道题的三个人…

Gparted重新分配swap空间之后,linux电脑读不到swap空间

问题背景 lsblk 显示存在物理设备&#xff08;如 /dev/nvme0n1&#xff09;&#xff0c;但 swapon --show 无输出 说明 系统未启用任何 Swap 设备 问题原因分析 /etc/fstab 中 Swap 的 UUID 配置错误 从图片中看到执行 sudo swapon -a 时报错&#xff1a; swapoff: cannot fin…

第一节:Vben Admin 最新 v5.0初体验

系列文章目录 基础篇 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 第三节&#xff1a;Vben Admin登录对接后端login接口 第四节&#xff1a;Vben Admin登录对接后端getUserInfo接口 第五节&#xff1a;Vben Admin权…