Leetcode2542-最大子序列的分數

1.問題轉換?

????????首先明確題意,要選取的值和num1,num2兩個數組都有關,但是num1中選取的是k個數,num2中選取的是1個數,顯然num2中的數所占的權重較大(對結果影響較大),所以我們就可以對num2進行排序(也可以對nums1進行排序,就是對nums1排列以后枚舉時獲取nums2最小值特麻煩,就不再贅述了,有興趣的讀者可以思考一下),枚舉num2中的每個數,然后確定num1中對應的k個數,但是選取元素時 num1 和 num2 對應的索引要一樣,所以不能對num2直接排序,那么就對num2所對應的索引進行排序即可,對num2的索引,按照num2的值從大到小進行排序,為什么從大到小,因為要過濾在num2中前k-1個數,在第k個數進行計算,看到下文便可知

        int len = nums1.length;Integer[] ids = new Integer[len];for (int i = 0; i < len; i++) {ids[i] = i;}//按照nums2[]  數組元素降序后排列的下標Arrays.sort(ids, (i, j) -> nums2[j] - nums2[i]);

進行這樣的排序之后,所得到的效果就是? nums2[ids[0]]? 就是nums2中最大的元素,nums2[ids[1]]就是num2中第二大的元素...? ? ?

? ? ? ? 要設計一個小頂堆,確保這k個數在遍歷時,是遍歷到的最大值,如果每次遇到一個值比堆頂元素大,那么就替換堆頂元素,并且定義一個變量 sum 記錄堆中元素的總和,便于計算

2. 要理解的三個點

A.? nums2[ids[i]] ? i 從 0 -> len - 1 ?遍歷 ? nums2[ids[i]] 就是降序的

B.??要從nums2[] 中第k大的元素 ?x ?開始遍歷,如果選了前面的數(比x大的數),那么nums1[] 就湊不出k個數滿足配件,例如圖片中的例子,如果選了nums2中最大的數4,對應的下標只有一個3,就湊不出3個下標,因為4在nums2中就是最大的,不存在兩個比4小的數

C.??nums1[] ?nums2[] ?中選取的下標都是一樣的,nums2[ids[i]] ?選取的下標是 ids[i] ? ?那么nums1[] 選取的下標也得是ids[i],? 所以先把 前k個 ids[i] 所以對應的nums1[] 的元素入小頂堆

3. 代碼編寫

????????首先就是將num2的最大值索引映射到ids上,這樣? i 從 0 -> len - 1 ?遍歷 ? nums2[ids[i]] 就是降序的,因為必須從num2中的第k個元素開始計算(至于為什么,看第二點),所以就跳過前k個num2中最大的數(跳過的索引為ids[0....k-1]),對應的就把num1[ids[0.....k-1]]? 這些元素入堆,并且計算和,此時已經有第一個結果,就定義res存儲這個結果。

????????因為通過k你已經確定了nums2的最大值了,因為位置是共同變換的,所以相應的nums1的和就是初始值,但是這個答案不一定是最大的,那么我們就需要往后選,num2往后選必然會越來越小,所以影響答案的是num1新加的數,不光要維護nums2最小值,還要維護nums1的和,每次都會新加一個數,小根堆維護的最小的k個元素,當加入的元素要比最小的小的話就更新

????????然后就是遍歷剩下的nums2中的len-k個元素,也就是比nums2[ids[k-1]] 小的元素,此時對應的小頂堆中維護的num1[] 中的值也應該發生變化,因為nums2[] 的索引發生了變化,如果nums1[ids[i]] > minHeap.peek()? 那么就彈出堆頂元素,將nums1[ids[i]]入堆,確保堆中元素是遍歷過的元素里面最大的k個元素,同時更新res和sum,具體代碼如下

    public static long maxScore(int[] nums1, int[] nums2, int k) {//需要以及難理解的3點://1. nums2[ids[i]]   i 從 0 -> len - 1  遍歷   nums2[ids[i]] 就是降序的//2. 要從nums2[] 中第k大的元素  x  開始遍歷,如果選了前面的數(比x大的數),那么nums1[] 就湊不出k個數滿足配件//3. nums1[]  nums2[]  中選取的下標都是一樣的,nums2[ids[i]]  選取的下標是 ids[i]    那么nums1[] 選取的下標也得是ids[i]//   所以先把 前k個 ids[i] 所以對應的nums1[] 的元素入小頂堆int len = nums1.length;Integer[] ids = new Integer[len];for (int i = 0; i < len; i++) {ids[i] = i;}//想要對nums2[]  進行排序,但是對應的索引不能邊,就對索引按照nums2的元素從大到小進行排序Arrays.sort(ids, (i, j) -> nums2[j] - nums2[i]);//從 0 -> len   遍歷nums2[ids[i]]          就得到的是nums2從大到小遍歷的結果//直接獲取nums1中最大的前k個數即可PriorityQueue<Integer> minHeap = new PriorityQueue<>();long sum = 0;for (int i = 0; i < k; i++) {sum += nums1[ids[i]];minHeap.add(nums1[ids[i]]);}// 枚舉的nums2[] 中的最大值,一定不是整個數組的最大值,而是nums2中的第k大的值,// 這樣的話,nums1中才能找到k個與之對應的元素,如果找nums2中最大值,那么對應的nums1中的值只有一個// 所以必須得從nums2的第k大個元素開始,枚舉的num2一直變小,然后對應的minHeap中的值變大long res = sum * nums2[ids[k - 1]];for (int i = k; i < len; i++) {int x = nums1[ids[i]];if (x > minHeap.peek()) {sum += x - minHeap.poll();minHeap.add(x);res = Math.max(res, nums2[ids[i]] * sum);}}return res;}

4.總結

????????說實話,這道題我認為還是挺不好理解的,我自己刷的時候也思考了很久,這個問題轉換是這道題的核心,需要注意的三個點必須理清楚(尤其是必須從第k大的元素開始計算,還有兩個數組所選取元素的索引是一樣的),建議讀者反復觀看

? ? ? ? 這道題我沒見過的點是:想要對一個數組進行排序,但是又想讓其對應的索引不變,就創建一個索引數組,讓這個索引數組按照待排序數組的元素大小,升序或者降序排列,這樣就把num2數組排序后的結果,映射到了ids數組中

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

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

相關文章

【Java探索之旅】多態:向上下轉型、多態優缺點、構造函數陷阱

文章目錄 &#x1f4d1;前言一、向上轉型和向下轉型1.1 向上轉型1.2 向下轉型 二、多態的優缺點2.1 多態優點2.2 多態缺陷 三、避免避免構造方法中調用重寫的方法四、好的習慣&#x1f324;?全篇總結 &#x1f4d1;前言 在面向對象編程中&#xff0c;向上轉型和向下轉型是常用…

Django 新增數據 create()方法

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

小米訂單銳減背后的挑戰與應對之道

近期&#xff0c;富士康印度子公司Bharat FIH面臨高管離職、工廠關閉的困境&#xff0c;其背后原因之一是小米訂單的顯著下滑&#xff0c;據報道&#xff0c;這一降幅高達70%。這一現象不僅反映了富士康在印度市場的艱難處境&#xff0c;也揭示了小米在全球智能手機市場面臨的挑…

六、數據可視化—Wordcloud詞云(爬蟲及數據可視化)

六、數據可視化—Wordcloud詞云&#xff08;爬蟲及數據可視化&#xff09; 也是一個應用程序 http://amueller.github.io/word_cloud/ Wordcloud詞云&#xff0c;在一些知乎&#xff0c;論壇等有這樣一些東西&#xff0c;要么做封面&#xff0c;要么做講解&#xff0c;進行分析…

C++ | Leetcode C++題解之第223題矩形面積

題目&#xff1a; 題解&#xff1a; class Solution { public:int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth min(ax2, bx2) - max…

實戰Qt開發WordBN筆記軟件#01 搭建開發環境:VS2019+Qt6.5+CMake+Git

01 背景 【WordBN字遠筆記】是天恩軟件工作室開發的一款免費筆記軟件&#xff1b;WordBN基于VS2019、Qt6.5開發&#xff0c;使用Qt Quick&#xff08;QML&#xff09;開發語言。 本課程將以【WordBN字遠筆記】的界面為實戰基礎&#xff0c;詳細介紹如何基于Qt/QML開發語言&am…

WPF 表格控件斑馬線使用

這里用ListView為案例。 如圖效果&#xff1a; 主要思路&#xff1a; 用AlternationCount屬性來設置需要使用斑馬線的條數&#xff0c;就是說幾行一換色&#xff0c;也可以理解為需要幾種顏色&#xff0c; 然后再樣式模板中&#xff0c;寫觸發器屬性ItemsControl.Alternatio…

python深拷貝和淺拷貝之間的區別是什么?

在Python中&#xff0c;深拷貝和淺拷貝是兩種不同的對象復制機制&#xff0c;它們在復制對象時的行為有顯著差異&#xff1a; 1. 淺拷貝&#xff08;Shallow Copy&#xff09;: - 淺拷貝創建一個新對象&#xff0c;但它只是復制了原始對象中元素的引用&#xff08;對于可變…

明明已經安裝了python中的某個庫,但是還是報錯ModuleNotFoundError: No module named ‘sklearn‘

問題&#xff1a; 明明已經安裝了python中的某個庫&#xff0c;但是還是報錯ModuleNotFoundError: No module named sklearn 解決方法&#xff1a; 卸載重新安裝一下即可 pip uninstall scikit-learn pip install scikit-learn 成功解決&#xff01;&#xff01;&#xff…

《Windows API每日一練》9.1 資源-圖標

本節講述圖標、鼠標指針位圖、字符串資源表、自定義資源的添加和應用。 本節必須掌握的知識點&#xff1a; 圖標 第56練&#xff1a;ICON圖標資源 鼠標指針位圖 字符串資源表 自定義資源 第57練&#xff1a;字符串資源表和自定義資源 9.1.1 圖標 在 Windows 窗口編程中&…

知識付費系統3.0整站源碼知識付費網課平臺網創資源付費帶自動采集同步插件

程序說明&#xff1a; 1.修復更新到最新版本 2.自動采集插件重寫 3.關閉采集授權域名直接對接 4.更新插件主動請求同步資源 5.帶自動采集插件 原始功能 支持分類替換 將主站同步過來的文章分類進行替換 支持自定義文章作者&#xff08;選擇多個作者則同步到的文章作者將會隨機分…

java中==和equals()的區別探究

目錄 一、Object對象 二、 三、String類的equals()方法 四、示例 4.1直接定義兩個相同的值比較 4.2直接定義兩個值不同的字符串進行比較 4.3直接定義一個字符串和new一個字符串進行比較&#xff08;兩者值相同&#xff09; 4.4直接定義一個字符串和new一個字符串進行…

Halcon Ean13 一維碼讀取

一 EAN碼介紹 1 EAN碼定義: EAN碼是國際物品編碼協會制定的一種商品用條碼&#xff0c;通用于全世界。EAN碼符號有標準版&#xff08;EAN-13&#xff09;和縮短版&#xff08;EAN-8&#xff09;兩種。標準版表示13位數字&#xff0c;又稱為EAN13碼&#xff0c;縮短版表示8位數…

VScode免密鏈接ubuntu

Ubuntu 下載&#xff1a; sudo apt-get install openssh-serverps -e | grep sshd參考IP &#xff1a; ifconfig VScode配置 重新嘗試連接&#xff0c;輸入的密碼是虛擬機用戶密碼 免密鏈接 Windows生成公鑰 1、打開CMD 2、輸入命令ssh-keygen 3、連續回車確認即可生成 …

正態、威布爾、指數分布、伽馬分布、對數正態分布介紹

目錄 正態、威布爾、指數分布、3.1 概念介紹概率密度函數&#xff08;PDF&#xff09;累積分布函數&#xff08;CDF&#xff09;性質應用 3.2 參數及繪圖參數概率密度函數&#xff08;PDF&#xff09;累積分布函數&#xff08;CDF&#xff09;繪圖圖像解讀 3.3 指數分布擬合代碼…

Emacs有什么優點,用Emacs寫程序比IDE更方便嗎?

Emacs 是一款歷史悠久且功能強大的文本編輯器&#xff0c;它以其高度的可定制性和豐富的功能而聞名。在討論 Emacs 的優點以及它是否比 IDE 更方便時&#xff0c;我們需要從多個角度進行深入分析。以下是對 Emacs 優點的詳細闡述&#xff0c;以及它與 IDE 的比較。 Emacs 的優…

第11章 規劃過程組(二)(11.10制訂進度計劃)

第11章 規劃過程組&#xff08;二&#xff09;11.10制訂進度計劃&#xff0c;在第三版教材第395~397頁&#xff1b;文字圖片音頻方式 第一個知識點&#xff1a;定義及作用 分析活動順序、持續時間、資源需求和進度制約因素&#xff0c;創建項目進度模型&#xff0c;從而落實項目…

Docker定時清理

一、循環調度執行 1、檢查cron狀態 systemctl status crond 2、創建要執行的shell腳本 vim /home/cleanup_docker.sh #! /bin/bash # 清理臨時文件 echo $(date "%H:%M:%S") "執行docker清理命令..." docker system prune -af-a 清理包括未使用的鏡像 …

Android EditText+ListPopupWindow實現可編輯的下拉列表

Android EditTextListPopupWindow實現可編輯的下拉列表 &#x1f4d6;1. 可編輯的下拉列表?步驟一&#xff1a;準備視圖?步驟二&#xff1a;封裝顯示方法?步驟三&#xff1a;獲取視圖并監聽 &#x1f4d6;2. 擴展上下箭頭?步驟一&#xff1a;準備上下箭頭icon圖標?步驟二&…

Redisson分布式鎖、可重入鎖

介紹Redisson 什么是 Redisson&#xff1f;來自于官網上的描述內容如下&#xff01; Redisson 是一個在 Redis 的基礎上實現的 Java 駐內存數據網格客戶端&#xff08;In-Memory Data Grid&#xff09;。它不僅提供了一系列的 redis 常用數據結構命令服務&#xff0c;還提供了…