LeetCode算法題(Go語言實現)_51

題目

給你兩個下標從 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 := 0maxScore := 0for _, pair := range pairs {num2, num1 := pair[0], pair[1]heap.Push(h, num1)total += num1if h.Len() > k {total -= heap.Pop(h).(int)}if h.Len() == k {current := total * num2if current > maxScore {maxScore = current}}}return int64(maxScore)
}type minHeap []intfunc (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 := *hn := 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 heapqdef maxScore(nums1, nums2, k):# 將nums2和nums1的元素配對,并按nums2的值降序排列pairs = sorted(zip(nums2, nums1), key=lambda x: -x[0])heap = []total = 0max_score = 0for 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 * num2if current_score > max_score:max_score = current_scorereturn max_score

五、總結與優化

1. 算法對比
方法優勢適用場景
貪心+優先隊列時間效率高需要動態維護最大值
暴力枚舉實現簡單小規模數據
動態規劃可處理復雜約束需要狀態轉移的情況
2. 工程優化
  • 內存優化:在原數組上操作減少內存消耗。
  • 并行排序:使用多線程加速大規模數據排序。
  • 剪枝策略:提前終止不可能產生更優解的分支。
3. 擴展方向
  • 在線處理:支持數據流動態添加元素。
  • 多目標優化:同時考慮多個目標函數的最優解。
  • 近似算法:針對超大數據設計近似解法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901781.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

并查集(力扣2316)

這種涉及不同連通分量的&#xff0c;看上去就可以用并查集。并查集的模板請參見上一篇內容。并查集&#xff08;力扣1971&#xff09;-CSDN博客 現在我們要求的是無法互相到達的點對。根據觀察易得&#xff0c;我們只需要求出每個并查集的元素數量&#xff0c;然后遍歷每個點&…

Python在生成藝術中的創新應用

Python在生成藝術中的創新應用 在數字藝術的浪潮中,Python以其強大的庫支持和簡潔的語法,成為了生成藝術領域的一顆璀璨明珠。今天,就讓我們一起踏上這段充滿創意與驚喜的旅程,探索Python如何在生成藝術中大放異彩。 一、引言 生成藝術,是一種通過算法自動生成藝術作品的…

ROS ROS2 機器人深度相機激光雷達多傳感器標定工具箱入門教程(一)

系列文章目錄 目錄 系列文章目錄 前言 一、安裝 1.1 ROS 2 官方軟件包 二、教程 2.1 標定配置器 2.1.1 機器人選項 2.1.2.1 外參相機-激光雷達標定 2.1.2.2 外參激光雷達-激光雷達標定 2.1.2.3 外參相機參照標定 2.1.2.4 外參激光雷達-參考標定 2.2 外參照相機-激…

Ubuntu利用docker搭建Java相關環境問題記錄

Docker拉取鏡像超時 報錯 Unable to find image dpanel/dpanel:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/ ": context deadline exceeded (Client.Timeout exceeded while awaiting headers)解決方式 在etc/do…

list的模擬實現和反向迭代器的底層

1&#xff1a;list的模擬實現 1&#xff1a;鏈表的節點 對于list的模擬實現&#xff0c;我們需要先定義一個節點的類可以使用&#xff08;class也可以使用struct&#xff09; // List的節點類 template<class T> struct ListNode {ListNode(const T& val T()){_p…

數據加載與保存

通用方式? SparkSQL提供了通用的數據加載方式&#xff0c;使用spark.read.loa方法&#xff0c;并可通過format指定數據類型&#xff08;如csv、jdbc、json、orc、parquet、textFile&#xff09;。 load方法后需傳入數據路徑&#xff08;針對csv、jdbc、json、orc、parquet、…

7 編譯型語言、解釋型語言與混合型語言的深度解析:以 C、Java、Python 為例

在編程領域&#xff0c;語言的執行方式是其設計哲學的核心體現&#xff0c;直接影響著性能、可移植性和開發效率。本文將深入剖析編譯型語言&#xff08;以 C 語言為例&#xff09;、解釋型語言&#xff08;以 Python 為例&#xff09;和混合型語言&#xff08;以 Java 為例&am…

Edge瀏覽器安卓版流暢度與廣告攔截功能評測【不卡還凈】

安卓設備上使用瀏覽器的體驗&#xff0c;很大程度取決于兩個方面。一個是滑動和頁面切換時的反應速度&#xff0c;另一個是廣告干擾的多少。Edge瀏覽器的安卓版本在這兩方面的表現比較穩定&#xff0c;適合日常使用和內容瀏覽。 先看流暢度。Edge在中端和高端機型上啟動速度快&…

智能云圖庫-12-DDD重構

本節重點? 之前我們已經完成了本項目的功能開發。由于本項目功能豐富、代碼量大&#xff0c;如果是在企業中維護開發的項目&#xff0c;傳統的 MVC 架構可能會讓后續的開發協作越來越困難。所以本節魚皮要從 0 帶大家學習一種新的架構設計模式 —— DDD 領域驅動設計。 大綱…

量子安全郵件系統 —— 郵件回溯密鑰銷毀機制

這里寫目錄標題 量子安全郵件系統 —— 郵件回溯密鑰銷毀機制一、項目背景與簡介二、理論基礎2.1 密鑰銷毀的重要性2.2 時間衰減與回溯銷毀2.3 安全日志與報警機制三、系統架構設計3.1 模塊劃分3.2 系統架構圖(Mermaid示意圖)四、關鍵算法與實現流程4.1 密鑰生成與存儲4.2 郵…

個人博客系統后端 - 用戶信息管理功能實現指南(上)

本文記錄了如何實現用獲取戶信息&#xff0c;用戶信息更新&#xff0c;用戶頭像上傳三大基礎功能 先上接口實現截圖&#xff1a; 一、項目結構概覽 先介紹一下 個人博客系統采用了標準的 Spring Boot 項目結構&#xff0c;用戶功能相關的文件主要分布在以下幾個目錄&#xff1a…

趣味編程之分布式系統:負載均衡的“雨露均沾“藝術

#此篇文章由Deepseek大力支持&#x1f60b; 凌晨三點&#xff0c;西二旗某火鍋店后廚—— “羊肉卷走3號桌&#xff01;” “肥牛卷去7號&#xff01;” “蝦滑優先給VIP區&#xff01;” 我蹲在傳菜口的監控屏幕前&#xff0c;看著機器人服務生們忙而不亂地穿梭。突然間&am…

Linux——信號(1)信號的產生

我們在講進程的多種狀態時提到過&#xff0c;一個進程的退出有三種情況&#xff1a;正常退出&#xff0c;結果出錯退出&#xff08;代碼也執行完了&#xff09;&#xff0c;異常終止退出&#xff08;代碼未執行完&#xff09;&#xff0c;其中最后一種退出相當于進程在運行時&a…

LeetCode 2919 使數組變美的最小增量運算數

動態規劃解題&#xff1a;最小操作次數使數組變為美麗數組 問題描述 給定一個下標從0開始、長度為n的整數數組nums和一個整數k。你可以對數組中的任意一個元素進行加1操作&#xff0c;操作次數不限。如果數組中任意長度大于或等于3的子數組的最大值都大于或等于k&#xff0c;…

計算生物學在中國的發展情況?

李升偉 整理 計算生物學在中國的發展呈現出多方面積極態勢&#xff0c;具體表現如下&#xff1a; 發展概述&#xff1a; 上海發布了醫用AI發展的專項方案&#xff0c;特別強調了腦科學與計算生物學的前沿領域。這表明政府有意推動該領域的技術進步和技術合作平臺建設。國內的…

Linux之文件內容顯示(cat、grep、cut、sort、uniq、tr)

&#x1f3af; 本文專欄&#xff1a;Linux &#x1f680; 作者主頁&#xff1a;小度愛學習 1、瀏覽普通文件內容 命令常用選項說明cat-n 對輸出內容中的所有行標注行號&#xff1b;-b 對輸出內容中的非空行標注行號。查看文本文件的內容head-num 指定需要顯示文件num行的內容。…

3DS 轉 STL 全攻略:傳統工具與迪威模型網在線轉換深度解析

在 3D 建模與 3D 打印的技術領域中&#xff0c;常常會遇到需要將不同格式的文件進行轉換的情況。其中&#xff0c;把 3DS 文件轉換為 STL 格式是較為常見的操作。3DS 文件作為一種舊版 Autodesk 3D Studio 使用的 3D 圖像格式&#xff0c;存儲著豐富的信息&#xff0c;包括網格…

IoT FEM射頻前端模組芯片(2.4G PA)三伍微電子GSR2401 兼容替代RFX2401

型號&#xff1a;GSR2401應用&#xff1a;適用于藍牙&#xff08;BT&#xff09;、ZigBee及物聯網&#xff08;IoT&#xff09;設備 功能&#xff1a;集成了功率放大器&#xff08;PA&#xff09;、開關&#xff08;Switch&#xff09;和低噪聲放大器&#xff08;LNA&#xff…

Missashe考研日記-day22

Missashe考研日記-day22 1 專業課408 學習時間&#xff1a;3h學習內容&#xff1a; 先把昨天關于進程調度的課后習題做了&#xff0c;然后花了挺長時間預習OS的最最最最重要的一部分——同步與互斥問題&#xff0c;這部分大二上課的時候就懵懵懂懂的&#xff0c;得認真再領悟…

2025年最新Web安全(面試題)

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…