【算法】貪心算法:最大數C++

文章目錄

  • 前言
  • 題目解析
  • 算法原理
    • 字典序
  • 代碼示例
  • 策略證明

前言

題目的鏈接,大家可以先試著去做一下再來看一下思路。179. 最大數 - 力扣(LeetCode)

題目解析

還是老樣子,把題目讀懂,畫出有用信息。

在這里插入圖片描述

認真看示例,要好好去想一下,特殊示例的情況。

在這里插入圖片描述

算法原理

在這里插入圖片描述

字典序

插個小曲,介紹一下字典序。

  1. 概念:
    字典序(LexicographicalOrder),也稱為詞典序、字母序或詞典順序,是一種基于字符順序的字符串比較方法。它類似于我們在字典中查找單詞的順序。
  2. 字符編碼基礎
    字典序依賴于字符的編碼系統:
    ASCII:‘0’=48, ‘1’=49, …, ‘9’=57, ‘A’=65, ‘B’=66, …, ‘a’=97, ‘b’=98, …
    Unicode:包含更多字符,但數字和字母的順序與ASCII一致。
  3. 比較規則
    字典序的核心規則是從左到右逐字符比較:

比較第一個字符: 如果字符不同,則根據字符的編碼值(如ASCII或Unicode)決定順序;編碼值小的字符串排在前面 。
例一: “apple” vs “banana” → “apple” < “banana”(因為 ‘a’<‘b’);

如果第一個字符相同:比較第二個字符;依此類推,直到找到不同的字符。
例二:“dat” vs “dog” → “dat” < “dog”(因為’a’<‘o’)

所有字符都相同: 較短的字符串排在較長的字符串前面。
例三:“hello” vs “hell” → “hell” <“hello”(相同前綴,較短者優先)

  1. 示例解析

數字字符串比較:
“2” vs “10” → “10” < “2”(因為 ‘1’<‘2’)
“30” vs “4” → “30” <“4”(因為 ‘3’<‘4’)
“100” vs “2” → “100” < “2”(因為 ‘1’<‘2’)
混合比較:
“file9” vs “file10” → “file10” < “file9”(因為 ‘1’<‘9’)
“item2” vs “item10” → “item10” < “item2”(因為 ‘1’<‘2’)

  1. 在本代碼中的應用
    在largestNumber算法中(largestNumber 算法通常指的是如何將一組非負整數重新排列,使得它們拼接后的數字是最大的。),我們使用字典序比較拼接后的字符串為什么有效呢。
//這行代碼是自定義排序比較邏輯的核心,它決定了兩個字符串在排序時的相對順序。
//如果 s1 + s2 組成的字符串更大,返回 true,表示 s1 應該排在 s2 前面。
//如果 s2 + s1 更大,返回 false,表示 s2 應該排在 s1 前面。
return s1 + s2 > s2 + s1;

長度相等:s1+s2和s2+s1長度相同(len(s1)+len(s2))
字典序等價數值序:當兩個數字字符串長度相同時,字典序大小關系等同于數值大小關系。

  1. 字典序與數值序的區別
比較方式“2” vs “10”“30” vs “4”“100” vs “2”
字典序“10” < “2”“30” < “4”“100” < “2”
數值序10 > 230 > 4100 > 2

字典序:基于字符編碼從左到右比較.。
數值序:基于實際數值大小比較。

  1. 在算法中的重要性

在本問題中,使用字典序比較拼接字符串是高效的,因為:
避免了大數計算(拼接后可能超出整數范圍) 。
利用字符串比較的內置優化。
當長度相同時,保持數值大小關系。

  1. 總結

字典序是一種基于字符編碼順序的字符串比較方法:
從左到右逐字符比較。
編碼值小的字符排在前。
相同前綴時較短字符串排在前。
在等長數字字符串比較中等價于數值比較。

代碼示例

class Solution {
public:string largestNumber(vector<int>& nums){//優化一下,把所有的整數轉化為字符串,我們用字典序去比較,比直接轉換整形比較好很多,vector<string> str;for(auto x : nums) str.push_back(to_string(x));//排序,拼接字符串,比較字典序。當兩個數字字符串長度相同時,字典序大小關系等同于數值大小關系。//標準庫的 sort 通常使用快速排序,這類比較排序算法的核心是通過多次比較和交換元素位置來達到有序。sort(str.begin(),str.end(),[](const string &s1, const string &s2){return s1 + s2 > s2 + s1;});//提取結果string ret;for(auto &s : str) ret += s;//特殊情況,數組中全是0不能返回"000...",應該返回"0"if(ret[0] == '0') return "0";return ret; }
};

策略證明

證明方法:全序關系

全序關系(Total Order)是指在一個集合X上,滿足以下三個條件的二元關系:
完全性:對于集合中的任意兩個元素a和b,要么a ≤ b,要么b ≤ a 。
反對稱性:如果a ≤ b且b ≤ a,則a = b。
傳遞性:如果a ≤ b且b ≤ c,則a ≤ c。
全序關系也稱為線性序或簡單序。一個具有全序關系的集合稱為全序集。
例如,實數集上的小于等于關系(≤)就是一個全序關系,因為任意兩個實數都可以比較大小。

假設定義了集合{a,b,c,d,e,f,g},我從集合中任意挑選兩個元素,如果這兩個元素在你定義的比較規則下,滿足全序關系的話,我們就說這個集合是可以排序的。
只要滿足下面三個性質,就有全序關系。
1.完全性,2.反對稱性,3.傳遞性

我們接下來就要去證明我們算法原理中的自定義排序是否有效。
在這里插入圖片描述

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

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

相關文章

網絡安全職業指南:探索網絡安全領域的各種角色

本文旨在為對網絡安全領域感興趣的粉絲讀者提供一份全面的職業指南。我們將探討網絡安全領域中各種不同的職業角色&#xff0c;包括其職責、所需技能以及職業發展路徑&#xff0c;幫助你了解網絡安全領域的職業選擇&#xff0c;并為你的職業規劃提供參考。網絡安全職業概覽 身處…

Design Vision:顯示扇入/扇出邏輯

相關閱讀 Design Visionhttps://blog.csdn.net/weixin_45791458/category_13006970.html?spm1001.2014.3001.5482 在使用Design Vision中查看示意圖時&#xff0c;可以在示意圖中查看所選單元(Cell)、引腳(Pin)、端口(Port)或線網(Net)的扇入/扇出邏輯。用戶可以在當前激活的…

13.7 Meta LLaMA2-Chat核心技術突破:三重強化學習實現91.4%安全評分,超越ChatGPT的對話模型架構全解析

Meta LLaMA2-Chat核心技術突破:三重強化學習實現91.4%安全評分,超越ChatGPT的對話模型架構全解析 指令微調模型:LLaMA2-Chat 技術深度解析 LLaMA2-Chat 作為 Meta 推出的對話優化大模型,其技術實現展現了大模型對齊(Alignment)領域的前沿突破。與基礎版 LLaMA2 相比,該…

二維仿射變換筆記

二維仿射變換筆記 1. 數學基礎 1.1 變換矩陣 二維仿射變換使用3x3的齊次坐標矩陣表示: [a b tx] [c d ty] [0 0 1 ]其中: [a b; c d] 是線性變換部分,表示旋轉、縮放和錯切[tx; ty] 是平移部分最后一行 [0 0 1] 是齊次坐標的固定形式1.2 基本變換 1.2.1 平移變換 將點…

創建自定義Dataset類與多分類問題實戰

codes 文章目錄&#x1f31f; 6 多分類問題與卷積模型的優化&#x1f9e9; 6.1 創建自定義Dataset類?? 數據集特點&#xff1a;&#x1f511; 關鍵實現步驟&#xff1a;&#x1f6e0;? 自定義Dataset類實現&#x1f4ca; 數據集劃分與可視化&#x1f9e0; 6.2 基礎卷積模型&…

用vue自定義指令設置頁面權限

1.按鈕權限處理/*** v-hasPermi 按鈕權限處理*/import store from /storeexport default {inserted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions store.getters && store.getters.permissionsif (value…

JPA / Hibernate

1. JPA 和 Hibernate 有什么區別&#xff1f;JPA 是 Java 官方提出的一套 ORM 規范&#xff0c;它只定義了實體映射、關系管理、查詢接口等標準&#xff0c;不包含具體實現。Hibernate 是對 JPA 規范的最常用實現&#xff0c;提供了完整的 ORM 功能&#xff0c;并擴展了許多 JP…

kibana顯示未準備就緒

kibana顯示未準備就緒 最近在研究新版本的ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;棧時遇到了一個問題&#xff1a;雖然服務器本身能夠訪問ELK服務&#xff0c;但通過瀏覽器嘗試訪問時卻無法成功。這里我將分享一些可能的排查步驟和解決方案。連接es的地址…

語音對話秒譯 + 視頻懸浮字 + 相機即拍即譯:ViiTor 如何破局跨語言場景?

在跨語言信息獲取場景中&#xff0c;語言壁壘常導致效率降低。ViiTor Translate 試圖通過 “場景化功能布局” &#xff0c;覆蓋 語音、視頻、圖像、文本 四大維度翻譯需求。以下基于產品功能展示&#xff0c;拆解其核心能力&#xff1a; 1. 實時語音對話翻譯&#xff1a;打破交…

國內第一梯隊終端安全產品解析:技術與場景實踐

國內終端安全市場的第一梯隊產品&#xff0c;通常具備技術領先性、場景覆蓋度和規模化落地能力。結合 2025 年最新行業動態與實戰案例&#xff0c;以下從技術架構、核心能力和典型應用三個維度&#xff0c;解析當前市場的頭部產品及其差異化價值。一、技術架構與市場格局國內終…

FTP 備份,一種更安全的備份方式

備份數據后最重要的任務是確保備份安全存儲&#xff0c;最好是異地存儲。您可以通過物理方式將備份介質&#xff08;例如磁帶和 CD/DVD&#xff09;移動到異地位置。這是一個乏味、耗時、不方便且不可靠的方式。更簡單的解決方案是通過 FTP 備份到保存在異地的服務器。什么是 F…

理解 HTTP POST 請求中的 json 和 data 參數

在使用 Python 發送 HTTP POST 請求時&#xff08;無論是使用 requests 還是 aiohttp&#xff09;&#xff0c;json 和 data 參數有明確的區別和使用場景。理解這些區別對正確構建請求至關重要。關鍵區別特性json 參數data 參數內容類型自動設置為 application/json需要手動設置…

C#反射機制與Activator.CreateInstance

本文僅作為參考大佬們文章的總結。 反射是C#和.NET框架中一項強大的功能&#xff0c;允許程序在運行時檢查、創建和操作類型、方法、屬性等元數據。作為反射機制的核心組件&#xff0c;Activator.CreateInstance提供了動態實例化對象的靈活方式。本文將全面剖析C#反射的原理、…

Linux的用戶和用戶組與權限解析、環境變量說明與配置、sudo配置解析和使用

一、Linux的用戶及用戶組與權限 1.1、Linux的用戶和用戶組內容介紹 Linux的用戶角色分類序號Linux的用戶角色說明1超級用戶擁有對系統的最高管理權限&#xff0c;可執行任意操作&#xff0c;默認是root用戶2普通用戶只能對自己目錄下的文件進行訪問和修改&#xff0c;具有登錄系…

圖解LeetCode:79遞歸實現單詞搜索

網格 (board): 單詞搜索 中等 給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”…

2025 R3CTF

文章目錄EvalgelistSilent Profit&#xff08;復現&#xff09;Evalgelist <?phpif (isset($_GET[input])) {echo <div class"output">;$filtered str_replace([$, (, ), , ", "", "", ":", "/", "!&…

WebView JSBridge 無響應問題排查實錄 全流程定位橋接調用失效

在混合開發項目中&#xff0c;Web 頁面與 Native 的通信橋梁——JSBridge&#xff0c;承擔著極為關鍵的角色。它不僅讓網頁能調起原生功能&#xff08;分享、登錄、拍照等&#xff09;&#xff0c;也支持原生傳值、事件回調。 然而&#xff0c;當 JSBridge 調用“沒有響應”、c…

前端構建工具 Webpack 5 的優化策略與高級配置

前端構建工具 Webpack 5 的優化策略與高級配置 當你的項目啟動需要一分鐘&#xff0c;或者每次熱更新都像在“編譯整個宇宙”時&#xff0c;你可能已經意識到了一個問題&#xff1a;前端構建性能&#xff0c;正成為開發效率的瓶頸。Webpack 作為現代前端開發的基石&#xff0c;…

tun2socks原理淺析

tun2socks 的原理是將TUN 設備上的IP 數據包轉換為SOCKS 協議數據&#xff0c;然后通過SOCKS 代理服務器發送。簡單來說&#xff0c;它利用TUN 設備模擬一個虛擬網絡接口&#xff0c;將所有流經該接口的網絡流量重定向到SOCKS 代理&#xff0c;從而實現流量的代理轉發&#xff…

Go從入門到精通(22) - 一個簡單web項目-統一日志輸出

Go從入門到精通(21) - 一個簡單web項目-統一日志輸出 統一日志輸出 文章目錄Go從入門到精通(21) - 一個簡單web項目-統一日志輸出前言日志庫橫向對比zap 使用安裝依賴創建日志配置修改主程序的日志在處理函數中使用日志日志示例控制臺輸出文件輸出&#xff08;json&#xff09…