1046. 最后一塊石頭的重量


文章目錄

  • 1.題目
  • [1046. 最后一塊石頭的重量](https://leetcode.cn/problems/last-stone-weight/description/)
  • 2.思路
  • 3.代碼


1.題目

1046. 最后一塊石頭的重量

有一堆石頭,每塊石頭的重量都是正整數。

每一回合,從中選出兩塊** 最重的** 石頭,然后將它們一起粉碎。假設石頭的重量分別為 xy,且 x <= y。那么粉碎的可能結果如下:

- 如果 `x == y`,那么兩塊石頭都會被完全粉碎;- 如果 `x != y`,那么重量為 `x` 的石頭將會完全粉碎,而重量為 `y` 的石頭新重量為 `y-x`。

最后,最多只會剩下一塊石頭。返回此石頭的重量。如果沒有石頭剩下,就返回 0

示例:

**輸入:**[2,7,4,1,8,1]
**輸出:**1
**解釋:**
先選出 7 和 8,得到 1,所以數組轉換為 [2,4,1,1,1],
再選出 2 和 4,得到 2,所以數組轉換為 [2,1,1,1],
接著是 2 和 1,得到 1,所以數組轉換為 [1,1,1],
最后選出 1 和 1,得到 0,最終數組轉換為 [1],這就是最后剩下那塊石頭的重量。

2.思路

優先級隊列

priority_queue<int, vector<int>, greater<int>> minHeap;
創建小根堆,int是比較類型,vector<int>存儲元素底層容器類型,greater<int>是比較函數,小根堆必須寫
priority_queue<int> minHeap;
創建大根堆,int是比較類型,vector<int>存儲元素底層容器類型,可以不寫,less<int>是比較函數,大根堆可以不寫,下面這樣寫也可以
priority_queue<int, vector<int>, less<int>> minHeap;

push(const T& value):向隊列中插入一個元素,插入后堆會自動調整以保持優先級順序。

pop():刪除隊列中的堆頂元素(優先級最高的元素),堆會重新調整。

top():返回隊列中的堆頂元素(優先級最高的元素),但不刪除它。

empty():判斷隊列是否為空,如果為空返回 true,否則返回 false

size():返回隊列中元素的數量。

自定義類型比較:

#include <iostream>
#include <queue>
#include <vector>// 自定義結構體
struct Person {std::string name;int age;Person(const std::string& n, int a) : name(n), age(a) {}
};// 自定義比較函數,按年齡從大到小排序
//如果比較函數 comp(a, b) 返回 true 表示 a 的優先級低于 b,那么在堆中 b 會更靠近堆頂;反之,如果 comp(a, b) 返回 true 表示 a 的優先級高于 b,則 a 會更靠近堆頂。
struct ComparePerson {bool operator()(const Person& p1, const Person& p2) {return p1.age < p2.age;}
};int main() {// 創建一個存儲 Person 對象的大頂堆std::priority_queue<Person, std::vector<Person>, ComparePerson> personHeap;// 插入元素personHeap.push(Person("Alice", 25));personHeap.push(Person("Bob", 30));personHeap.push(Person("Charlie", 20));// 訪問堆頂元素(年齡最大的人)std::cout << "堆頂元素(年齡最大的人): " << personHeap.top().name << ", 年齡: " << personHeap.top().age << std::endl;return 0;
}

3.代碼

#include <vector>
#include <queue>class Solution {
public:// 該函數用于計算最后剩下石頭的重量// 給定一個整數向量 stones 表示每塊石頭的重量,模擬石頭碰撞過程,返回最后剩下石頭的重量int lastStoneWeight(std::vector<int>& stones) {// 創建一個大頂堆優先隊列 q,用于存儲石頭的重量// 大頂堆會自動將元素按從大到小的順序排列,堆頂元素始終是最大的std::priority_queue<int> q;// 遍歷石頭重量向量 stonesfor (auto& e : stones) {// 將每塊石頭的重量壓入優先隊列 q 中q.push(e);}// 當優先隊列中石頭的數量大于 1 時,繼續進行石頭碰撞操作while (q.size() > 1) {// 取出優先隊列中最重的石頭的重量,存儲在變量 x 中int x = q.top();// 將最重的石頭從優先隊列中移除q.pop();// 取出此時優先隊列中最重的石頭的重量,存儲在變量 y 中int y = q.top();// 將這塊石頭從優先隊列中移除q.pop();// 如果 x 大于 y,說明兩塊石頭碰撞后會剩下重量為 x - y 的石頭if (x > y) {// 將碰撞后剩下的石頭重量壓入優先隊列中q.push(x - y);}// 如果 x 等于 y,兩塊石頭碰撞后都消失,不需要再做額外操作}// 判斷優先隊列是否為空if (q.empty()) {// 如果為空,說明所有石頭都在碰撞過程中消失了,返回 0return 0;} else {// 如果不為空,說明還剩下一塊石頭,返回該石頭的重量return q.top();}}
};

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

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

相關文章

Qt多線程技術【線程池】:QRunnable 和 QThreadPool

在現代軟件開發中&#xff0c;尤其是在處理大量并發任務時&#xff0c;線程池技術是一種高效的解決方案。線程池不僅能提高程序的性能&#xff0c;還能有效管理線程的生命周期&#xff0c;避免頻繁的線程創建和銷毀所帶來的性能損失。本文將以Qt中的 QThreadPool 和 QRunnable …

DOM讓JavaScript可以對文檔中的標簽、屬性、內容等進行 訪增刪改 操作

示例 HTML 文檔 首先&#xff0c;我們有一個簡單的 HTML 文件 index.html&#xff0c;內容如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widt…

218.子結構判斷

class Solution {/*** 判斷樹 B 是否是樹 A 的子結構* param A 樹 A 的根節點* param B 樹 B 的根節點* return 如果 B 是 A 的子結構&#xff0c;返回 true&#xff1b;否則返回 false*/public boolean isSubStructure(TreeNode A, TreeNode B) {// 如果樹 B 為空&#xff0c;…

【DuodooBMS】基于Odoo的開源制造執行系統——以開源之力,驅動智能制造

以用戶為中心的開放式智造平臺 DuodooMES的設計始終圍繞“用戶可編程、生態可生長”的核心思想&#xff0c;打破傳統工業軟件的封閉性&#xff0c;讓制造企業真正成為系統的“主人”&#xff1a; 1. 用戶可編程&#xff1a;生產流程由你定義 界面可配置&#xff1a;無需代碼即…

Unity使用iTextSharp導出PDF-02基礎結構及設置中文字體

基礎結構 1.創建一個Document對象 2.使用PdfWriter創建PDF文檔 3.打開文檔 4.添加內容&#xff0c;調用文檔Add方法添加內容時&#xff0c;內容寫入到輸出流中 5.關閉文檔 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…

Navicat導入海量Excel數據到數據庫(簡易介紹)

目錄 前言正文 前言 此處主要作為科普帖進行記錄 原先Java處理海量數據的導入時&#xff0c;由于接口超時&#xff0c;數據處理不過來&#xff0c;后續轉為Navicat Navicat 是一款功能強大的數據庫管理工具&#xff0c;支持多種數據庫系統&#xff08;如 MySQL、PostgreSQL、…

文化財經t8優質短線期貨交易量化模型源碼

// 參數設置 BOLL_PERIOD : 20; // 布林帶周期 RSI_PERIOD : 14; // RSI 周期 OVERSOLD : 30; // 超賣線 OVERBOUGHT : 70; // 超買線 // 計算布林帶 MID : MA(CLOSE, BOLL_PERIOD); UPPER : MID 2 * STD(CLOSE, BOLL_PERIOD); LOWER : MID - 2 * STD(CLOSE,…

[AI]Mac本地部署Deepseek R1模型 — — 保姆級教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆級教程 DeepSeek R1是中國AI初創公司深度求索&#xff08;DeepSeek&#xff09;推出大模型DeepSeek-R1。 作為一款開源模型&#xff0c;R1在數學、代碼、自然語言推理等任務上的性能能夠比肩OpenAI o1模型正式版&#xff0c;并采用MI…

【UE5】PeerStream像素流部署

視頻教程 https://www.bilibili.com/video/BV1GhiuecEpK?spm_id_from333.788.videopod.sections&vd_source02dd8acc3a83a728e375ff61f1ebe725步驟 下載PeerStream代碼 代碼結構和項目如圖 github地址:https://github.com/inveta/PeerStreamEnterprise下載node node 對應…

老牌系統工具箱,現在還能打!

今天給大家分享一款超實用的電腦軟硬件檢測工具&#xff0c;雖然它是一款比較“資深”的軟件&#xff0c;但依然非常好用&#xff0c;完全能滿足我們的日常需求。 電腦軟硬件維護檢測工具 功能強大易用 這款軟件非常貼心&#xff0c;完全不需要安裝&#xff0c;直接打開就能用…

java商城解決方案

數字化時代&#xff0c;電子商務已成為企業拓展市場的重要渠道。對于想要建立在線商店的企業來說&#xff0c;選擇正確的技術堆棧至關重要。 Java作為一種成熟且廣泛使用的編程語言&#xff0c;為構建購物中心提供了強大的功能和靈活性。 商城Java源碼&#xff1a;商城開發的核…

軟件的生命周期和需求

什么是軟件的生命周期? 定義(描述) --> 創建 --> 使用 --> 銷毀 (這一整個過程就是事物的生命周期) 生命周期 那么軟件的生命周期又分為哪些呢? 一共分為十步: 可行性研究: 通過分析軟件開發要求,確定軟件項目的性質、目標和規模,得出可行性研究報告,如果可行性研…

QGIS如何下載高程數據

一、準備工作 安裝QGIS軟件 訪問QGIS官網下載最新版本,選擇適合操作系統的安裝包(如Windows 64位)完成安裝。建議使用3.28及以上版本以獲得完整功能支持。 注冊數據平臺賬號 NASA EarthData賬號:訪問EarthData登錄頁面注冊,用于SRTM數據下載。地理空間數據云賬號:訪問www…

【linux學習指南】線程同步與互斥

文章目錄 &#x1f4dd;線程互斥&#x1f320; 庫函數strncpy&#x1f309;進程線程間的互斥相關背景概念&#x1f309;互斥量mutex &#x1f320;線程同步&#x1f309;條件變量&#x1f309;同步概念與競態條件&#x1f309; 條件變量函數 &#x1f6a9;總結 &#x1f4dd;線…

MySQL索引優化,性能飆升的秘密!

0.前言 假設你經營一家電商平臺&#xff0c;某天用戶突然投訴商品搜索加載時間超過10秒。技術團隊緊急排查&#xff0c;發現一條原本執行0.1秒的查詢語句&#xff0c;在百萬級數據量下竟變成了全表掃描。這時&#xff0c;數據庫索引猶如深夜急診室里的救命儀器——它的存在與否…

基于STM32、HAL庫、HS12864(ST7920,并行接口)C語言程序設計

1、hs12864.h頭文件: #ifndef __HS12864_H #define __HS12864_H #ifdef __cplusplus extern "C" {#endif #include "stm32l4xx_hal.h" // 控制線定義 - 根據實際硬件修改 #define HS12864_RS_GPIO_PORT GPIOC #define HS12864_RS_PIN GPIO_PI…

【C語言】C語言 實踐課題選題系統(源碼+報告+數據文件)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;專__注&#x1f448;&#xff1a;專注主流機器人、人工智能等相關領域的開發、測試技術。 系C語言 實踐課題選題系統&#xff08;源碼報告數據…

基于SpringBoot的“高考志愿智能推薦系統”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“高考志愿智能推薦系統”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統總體結構圖 系統首頁界面 系統注冊頁…

React 低代碼項目:組件設計

React 低代碼項目&#xff1a;組件設計 Date: February 6, 2025 React表單組件 **目標&#xff1a;**使用 Ant Design 表單組件&#xff0c;開發登錄、注冊、搜索功能 內容&#xff1a; 使用 React 表單組件、受控組件使用 Ant Design 表單組件使用 表單組件的校驗和錯誤提…

深入剖析 Vue 的響應式原理:構建高效 Web 應用的基石

深入剖析 Vue 的響應式原理&#xff1a;構建高效 Web 應用的基石 在前端開發的廣闊天地里&#xff0c;Vue.js 憑借其簡潔易用的特性和強大的功能&#xff0c;成為眾多開發者的心頭好。其中&#xff0c;響應式原理作為 Vue 的核心亮點之一&#xff0c;讓數據與視圖之間實現了高…