【堆 優先隊列】1354. 多次求和構造目標數組

本文涉及知識點

堆 優先隊列

LeetCode1354. 多次求和構造目標數組

給你一個整數數組 target 。一開始,你有一個數組 A ,它的所有元素均為 1 ,你可以執行以下操作:
令 x 為你數組里所有元素的和
選擇滿足 0 <= i < target.size 的任意下標 i ,并讓 A 數組里下標為 i 處的值為 x 。
你可以重復該過程任意次
如果能從 A 開始構造出目標數組 target ,請你返回 True ,否則返回 False 。
示例 1:
輸入:target = [9,3,5]
輸出:true
解釋:從 [1, 1, 1] 開始
[1, 1, 1], 和為 3 ,選擇下標 1
[1, 3, 1], 和為 5, 選擇下標 2
[1, 3, 5], 和為 9, 選擇下標 0
[9, 3, 5] 完成
示例 2:
輸入:target = [1,1,1,2]
輸出:false
解釋:不可能從 [1,1,1,1] 出發構造目標數組。
示例 3:
輸入:target = [8,5]
輸出:true

提示:
N == target.length
1 <= target.length <= 5 * 104
1 <= target[i] <= 109

優先隊列

性質一:任何時候構造的數組arr,任意元素都大于>0。下面用數學歸納法證明:
一,初始狀態全部為1,符合。
二,假定操作前符合,則操作后也符合。操作前符合,意味者其和大于0,即修改后arr[i]的值大于0。
如果長度為1 ,target[0]等于1則可以構造,否則不能構造。故下文只討論n >=2。
性質二:根據性質一,n>=2,操作后,最大值一定會越來越大,且不會存在和最大值相同的其它值。
某處操作后,最大值的下標為i1,值為max1,和為sum1。則arr[i1]操作之前的值為 arr[i1] 為: max1 - (sum1-max1)
這樣做會超時,比如:[109,1]會執行109次。
改成:

const int canSub = heap.top() - 1;
const int cnt = canSub / (sum - heap.top());if (cnt < 1) { return false; }const auto old = heap.top() - (sum - heap.top())* cnt;

時間復雜度 :O(logn l o g 1.5 ∑ ( t a r g e t ) log_{1.5}{\sum(target)} log1.5?(target))
如果cnt為1 ,總和至少減少三分之一。
cnt為2,至少減少二分之一。
總而言之,每次操作總和會減少1。

代碼

將所有數據放到大根堆heap中,sum是大根堆中數據之和。不斷執行 上述操作,直到 heap.top()為1。
target全為1,也無需特殊處理。
初始heap全部是正數,修改后新增的值也為正數,故:sum1- heap.top()必定大于0。
由于heap中的數只會越來越小,故 heap中的數永遠小于等于109,故canSub-1一定在int范圍內。

核心代碼

class Solution {
public:bool isPossible(vector<int>& target) {priority_queue<int> heap;long long sum = 0;for (const auto& n : target) {heap.emplace(n);sum += n;}if (1 == heap.size()) { return 1 == heap.top(); }while (1 != heap.top()) {				const int canSub = heap.top() - 1;const int cnt = canSub / (sum - heap.top());if (cnt < 1) { return false; }const auto old = heap.top() - (sum - heap.top())* cnt;sum -= heap.top();heap.pop();sum += old;heap.emplace(old);}return true;}
};

擴展閱讀

視頻課程

先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關推薦

我想對大家說的話
《喜缺全書算法冊》以原理、正確性證明、總結為主。
按類別查閱鄙人的算法文章,請點擊《算法與數據匯總》。
有效學習:明確的目標 及時的反饋 拉伸區(難度合適) 專注
聞缺陷則喜(喜缺)是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。
如果程序是一條龍,那算法就是他的是睛

測試環境

操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境: VS2022 C++17
如無特殊說明,本算法用**C++**實現。

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

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

相關文章

idea在選定范圍搜索

idea在選定范圍搜索 CtrlR 在IntelliJ IDEA中&#xff0c;?如果你想在選定的范圍內搜索關鍵字&#xff0c;?可以按照以下步驟操作&#xff1a;? 首先&#xff0c;?使用鼠標選中你要搜索關鍵字的一個范圍。? 然后&#xff0c;?使用快捷鍵CtrlR&#xff08;?替換元素&am…

掌握JsonConvert.SerializeObject:美化輸出與序列化對象的藝術

目錄 引言 JsonConvert.SerializeObject簡介 參數詳解 使用示例 運行結果 結論 結語 引言 在現代軟件開發中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;被廣泛用于Web API、數據庫存儲以及跨平臺數據傳…

linux信息收集與提權

目錄 版本信息收集 kali得一些exp網站 kali自帶的searchsploit工具 臟牛提權漏洞&#xff08;改寫沒有寫權限的文件&#xff09; 測試靶場下載鏈接 sudo提權 上傳惡意C腳本進行編譯生成dirty的elf文件&#xff0c;也可以在攻擊機編譯好上傳 啟動&#xff0c;123456是設…

體驗完這款售價29999元起蘋果新品,我大受震撼

講道理&#xff0c;數碼圈已經很久沒有出現過讓人耳目一新的產品了。 整個圈子近些年各家新品邏輯給我的一種感覺是普遍主打循規循距&#xff0c;用高情商話來說那叫穩扎穩打不易出錯&#xff0c;而低情商嘛&#xff0c;說白了叫創新精神嚴重缺失。 「科技最后以換皮為準」這…

C語言學習 關于short和int

&#x1f308; 關于今天的這一part 簡單說說關于C中的short 和 int 主要是復盤C語言時候的一個小小的回顧把~&#xff08;內容來自C Primer Plus 第六版&#xff09; &#x1f433;主要是討論一下兩個東西 1?? 在給函數傳遞參數時&#xff0c;C編譯器把short類型的值自動轉換…

【CUDA】 Trust基本特性介紹及性能分析

Trust簡介 Thrust 是一個實現了眾多基本并行算法的 C 模板庫,類似于 C 的標準模板庫(standard template library, STL)。該庫自動包含在 CUDA 工具箱中。這是一個模板庫,僅僅由一些頭文件組成。在使用該庫的某個功能時,包含需要的頭文件即可。該庫中的所有類型與函數都在命名空…

【linux】 sudo apt update報錯——‘由于沒有公鑰,無法驗證下列簽名: NO_PUBKEY 3B4FE6ACC0B21F32’

【linux】 sudo apt update報錯——‘由于沒有公鑰&#xff0c;無法驗證下列簽名&#xff1a; NO_PUBKEY 3B4FE6ACC0B21F32’ 在運行sudo apt update時遇到報錯&#xff0c;由于沒有公鑰&#xff0c;無法驗證下列簽名&#xff1a; NO_PUBKEY 3B4FE6ACC0B21F32 解決方法&#x…

C++八股(五)之Linux常用命令

目錄 一、Linux常用命令有哪些? 二、Linux中查看進程運行狀態的指令、tar解壓文件的參數。??? 三、如何創建一個新的目錄??? 四、說說如何以root權限運行某個程序。? 五、linux里如何查看一個想知道的進程?? 六、Linux里如何查看帶有關鍵字的日志文件?? 七、…

Qt:11.輸入類控件(QLineEdit-單行文本輸入控件、QTextEdit-多行文本輸入控件、QComboBox-下拉列表的控件)

一、QLineEdit-單行文本輸入控件&#xff1a; 1.1QLineEdit介紹&#xff1a; QLineEdit 是 Qt 庫中的一個單行文本輸入控件&#xff0c;不能換行。允許用戶輸入和編輯單行文本。 1.2屬性介紹&#xff1a; inputMask 設置輸入掩碼&#xff0c;以限定輸入格式。setInputMask(con…

react學習——25redux實現求和案例(完整版)

1、目錄結構 2、count/index.js import React, {Component} from "react"; //引入store,用于獲取數據 import store from ../../redux/store //引入actionCreator 專門創建action對象 import {createDecrementAction,createIncrementAction} from ../../redux/coun…

CSS【詳解】邊框 border,邊框-圓角 border-radius,邊框-填充 border-image,輪廓 outline

邊框 border border 是以下三種邊框樣式的簡寫&#xff1a; border-width 邊框寬度 —— 數值 px&#xff08;像素&#xff09;,thin&#xff08;細&#xff09;,medium&#xff08;中等&#xff09;,thick&#xff08;粗&#xff09;border-style 邊框線型 —— none【默認值…

78. UE5 RPG 創建技能數據并初始化技能ui

在上一篇文章里&#xff0c;我們創建了技能的UI&#xff0c;接下來&#xff0c;我們要考慮如何實現對技能UI的填充&#xff0c;肯定不能直接寫死&#xff0c;需要有一些方法去實現技能的更新。我們期望能夠創建一個技能數據&#xff0c;然后根據數據通過回調的方式實現數據的更…

GET正常,POST獲取不到數據

環境復現 前臺&#xff1a; wx.request({url: xxxxxx,method: POST,header: {"content-type": "application/json"},success(res) {console.log(res);},fail(err) {console.error(網絡請求失敗, err);}}); 后端使用springboot&#xff1a; RequestMappin…

一鍵掌握天氣動態 - 基于Vue和高德API的實時天氣查詢

前言 本文將學習如何使用Vue.js快速搭建天氣預報界面,了解如何調用高德地圖API獲取所需的天氣數據,并掌握如何將兩者有機結合,實現一個功能豐富、體驗出色的天氣預報應用 無論您是前端新手還是有一定經驗,相信這篇教程都能為您帶來收獲。讓我們一起開始這段精彩的Vue.js 高德…

桌面懸浮備忘錄哪個好?能在桌面懸浮使用的備忘app

備忘錄是我們日常工作和生活中的常用工具&#xff0c;它幫助我們記錄重要信息&#xff0c;提醒我們完成各項任務。而將備忘錄懸浮在桌面上使用&#xff0c;無疑能進一步提高我們的工作效率。想象一下&#xff0c;在處理復雜的工作任務時&#xff0c;你能夠隨時在桌面上查看提醒…

C++原創娛樂系列抽搐的井號

玩法&#xff1a; 一次性輸入大量w&#xff0c;s&#xff0c;a&#xff0c;d&#xff0c;然后即可欣賞抽搐的井號 上代碼 #include"bits/stdc.h" #include"Windows.h" using namespace std; int main(){int w10,a10;char n;while(1){for(int i0;i<w;…

JS獲取本機ip地址方法

前端獲取本機ip地址&#xff1b;使用第三方免費API <script>function ipJson(ipJson) {console.log(獲取到的網絡IP,ipJson);//可以把結果存在window上&#xff0c;方便調用window.ipJson ipJson;} </script> <script src"https://whois.pconline.com.cn/…

產品使用手冊深度剖析:五步快速敲定產品手冊策劃思路

引言 在這個信息爆炸的時代&#xff0c;產品使用手冊不僅是產品的“說明書”&#xff0c;更是品牌與用戶之間建立情感連接的橋梁。一份優秀的手冊&#xff0c;能夠迅速吸引用戶的注意力&#xff0c;引導他們輕松上手&#xff0c;并深入體驗產品的魅力。那么&#xff0c;如何撰…

ruoyi項目swagger文檔升級knife4j文檔

注釋admin模塊中的swagger依賴加入knife4j依賴 <!-- swagger3--> <!-- <dependency>--> <!-- <groupId>io.springfox</groupId>--> <!-- <artifactId>springfox-boot-starter</artifactId>--…

IDEA常用技巧薈萃:精通開發利器的藝術

1 概述 在現代軟件開發的快節奏環境中&#xff0c;掌握一款高效且功能全面的集成開發環境&#xff08;IDE&#xff09;是提升個人和團隊生產力的關鍵。IntelliJ IDEA&#xff0c;作為Java開發者的首選工具之一&#xff0c;不僅提供了豐富的編碼輔助功能&#xff0c;還擁有高度…