每日算法-250429

每日 LeetCode 題解 (2025-04-29)

大家好!這是今天的 LeetCode 刷題記錄,主要涉及幾道可以使用貪心策略解決的問題。


2037. 使每位學生都有座位的最少移動次數

題目描述:
題目圖片

思路

貪心

解題過程

要使總移動次數最少,直觀的想法是讓每個學生移動到離他“最近”的可用座位。我們可以證明,最優策略是將位置排序后的第 i 個學生分配到排序后的第 i 個座位。

想象一下,如果我們將學生和座位都按位置排序。假設學生 Astudents[i],座位 Bseats[j],學生 Cstudents[k],座位 Dseats[l]。如果 i < kj > l (即學生 A 的位置小于學生 C,但 A 被分配到了位置更大的座位 B,而 C 被分配到了位置更小的座位 D),那么交換他們的座位(A 去 D,C 去 B)會使得總移動距離 |students[i] - seats[l]| + |students[k] - seats[j]| 不會超過原來的移動距離 |students[i] - seats[j]| + |students[k] - seats[l]|

因此,最優解是將排序后的 seats 數組和 students 數組按索引一一對應。我們只需對 seatsstudents 數組進行排序,然后計算對應位置 seats[i]students[i] 之間距離的絕對值之和。

復雜度

  • 時間復雜度: O ( N log ? N ) O(N \log N) O(NlogN),主要由排序 seatsstudents 數組決定,其中 N 是數組的長度。
  • 空間復雜度: O ( log ? N ) O(\log N) O(logN) O ( N ) O(N) O(N),取決于排序算法使用的空間(例如,Java 的 Arrays.sort 對于基本類型數組通常使用快速排序,需要 O ( log ? N ) O(\log N) O(logN) 的棧空間;對于對象數組使用 Timsort,可能需要 O ( N ) O(N) O(N) 的額外空間)。如果我們不考慮排序本身所需的輔助空間(或認為是在原地排序),可以認為是 O ( 1 ) O(1) O(1),但 O ( log ? N ) O(\log N) O(logN) 更為嚴謹。

Code

class Solution {public int minMovesToSeat(int[] seats, int[] students) {Arrays.sort(seats);Arrays.sort(students);int n = students.length;int ret = 0;for (int i = 0; i < n; i++) {ret += Math.abs(seats[i] - students[i]);}return ret;}
}

455. 分發餅干

題目描述:
題目圖片

思路

貪心

解題過程

目標是滿足盡可能多的孩子。貪心策略是:優先滿足胃口最小的孩子,并且用能滿足他的最小的餅干。

為了實現這個策略:

  1. 將孩子的胃口數組 g 和餅干尺寸數組 s 都進行升序排序。
  2. 使用兩個指針:i 指向當前考慮的孩子,j 指向當前考慮的餅干。
  3. 遍歷孩子數組(i 從 0 開始)。對于孩子 g[i],在餅干數組中找到第一個尺寸大于或等于 g[i] 的餅干 s[j]
  4. 如果找到了這樣的餅干 (s[j] >= g[i]),則這個孩子可以被滿足。我們將滿足的孩子數量 ret 加一,然后考慮下一個孩子 (i++) 和下一塊餅干 (j++)。
  5. 如果當前的餅干 s[j] 小于 g[i],說明這塊餅干無法滿足當前的孩子,我們需要嘗試更大的餅干,因此移動餅干指針 (j++),但仍然嘗試滿足同一個孩子 g[i]
  6. 當孩子指針 i 或餅干指針 j 超出數組范圍時,停止過程。

復雜度

  • 時間復雜度: O ( G log ? G + S log ? S ) O(G \log G + S \log S) O(GlogG+SlogS),主要由排序兩個數組決定。排序后的雙指針(或類似邏輯的循環)遍歷過程是線性的,時間復雜度為 O ( G + S ) O(G + S) O(G+S)。總時間復雜度由排序主導。 G 是孩子數量,S 是餅干數量。
  • 空間復雜度: O ( log ? G + log ? S ) O(\log G + \log S) O(logG+logS) O ( G + S ) O(G+S) O(G+S),同樣取決于排序算法使用的空間。

Code

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int ret = 0;for (int i = 0, j = 0; i < g.length; i++) {for (; j < s.length;) {if (g[i] <= s[j++]) {ret++;break;}}}return ret;}
}

1433. 檢查一個字符串是否可以打破另一個字符串

題目描述:
題目圖片

思路

貪心

解題過程

字符串 s1 能 “打破” s2 是指存在一種 s1 的排列,使得對于所有位置 is1[i] 的字典序大于或等于 s2[i]

一個關鍵的貪心思想是:如果 s1 能夠打破 s2,那么將 s1s2 按字典序排序后,排序后的 s1 必定也能打破排序后的 s2。這是因為排序將最小的字符對齊比較,次小的對齊比較,依此類推。如果存在任何一個 i 使得 sorted_s1[i] < sorted_s2[i],那么無論如何排列 s1,都不可能讓 s1 的所有字符都大于等于 s2 對應位置的字符(考慮反證法或鴿巢原理)。

所以,解題步驟如下:

  1. 將兩個字符串 ss1ss2 轉換成字符數組 s1s2
  2. s1s2 進行排序。
  3. 檢查排序后的 s1 是否能打破 s2 (即 s1[i] >= s2[i] 對所有 i 成立)。
  4. 同時檢查排序后的 s2 是否能打破 s1 (即 s2[i] >= s1[i] 對所有 i 成立)。

我們可以用兩個布爾變量 s1BreaksS2s2BreaksS1 來記錄這兩個條件是否滿足。在一次遍歷中,如果發現 s1[i] < s2[i],則 s1BreaksS2 置為 false;如果發現 s1[i] > s2[i] (等價于 s2[i] < s1[i]),則 s2BreaksS1 置為 false

最后,只要 s1BreaksS2s2BreaksS1 中至少有一個為 true,就返回 true

復雜度

  • 時間復雜度: O ( N log ? N ) O(N \log N) O(NlogN),主要由排序字符數組決定,其中 N 是字符串的長度。遍歷檢查的過程是 O ( N ) O(N) O(N)
  • 空間復雜度: O ( N ) O(N) O(N),因為需要創建字符數組來存儲和排序字符串內容。如果可以原地修改字符串(某些語言允許),且排序算法空間復雜度為 O ( log ? N ) O(\log N) O(logN),則空間可以優化。在 Java 中,toCharArray() 創建了新數組,所以是 O ( N ) O(N) O(N)

Code

class Solution {public boolean checkIfCanBreak(String ss1, String ss2) {char[] s1 = ss1.toCharArray();char[] s2 = ss2.toCharArray();Arrays.sort(s1);Arrays.sort(s2);boolean s1BreakS2 = true;boolean s2BreakS1 = true;for (int i = 0; i < s1.length; i++) {if (s1[i] < s2[i]) {s1BreakS2 = false;}if (s1[i] > s2[i]) {s2BreakS1 = false;}}return s1BreakS2 || s2BreakS1;}
}

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

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

相關文章

yolov8+kalman 實現目標跟蹤統計人流量

簡述 最近接了畢業生的畢業設計題&#xff0c;想著幫幫忙&#xff0c;要使用機器視覺識別&#xff0c;追蹤和邏輯統計的方式來統計人流&#xff0c;要求是滿足下面特性 高精度&#xff1a;YOLOv8 提供高質量檢測&#xff0c;卡爾曼濾波平滑跟蹤。高效率&#xff1a;兩者結合滿…

Shopify網上商店GraphQL Admin接口查詢實戰

目錄 一、Shopify網上商店 二、個人商店配置接口權限 三、PostMan調用接口測試 四、通過Java服務調用接口 一、Shopify網上商店 Shopify是由Tobi Ltke創辦的加拿大電子商務軟件開發商&#xff0c;總部位于加拿大首都渥太華&#xff0c;已從一家在咖啡店辦公的 5人團隊&…

【Tips】高效文獻管理:Zotero 導入參考文獻的多種方式詳解

高效文獻管理&#xff1a;Zotero 導入參考文獻的多種方式詳解 在學術研究中&#xff0c;高效管理參考文獻是提升效率的關鍵。Zotero 作為一款強大的文獻管理工具&#xff0c;提供了多種便捷的文獻導入方式。以下結合文獻題錄完整性對比分析&#xff0c;為大家詳細介紹 Zotero …

[AI]browser-use + web-ui 大模型實現自動操作瀏覽器

[AI]browser-use web-ui 大模型實現自動操作瀏覽器 介紹 官方地址&#xff1a;https://github.com/browser-use/web-ui browser-use主要作用是將 AI Agent 與瀏覽器鏈接起來從而實現由 AI 驅動的瀏覽器自動化。今天會給大家介紹如何通過browser-use web-ui來搭建并操作browse…

Springboot請求靜態資源時,request.getServletPath() 返回error

大家好&#xff0c;我是 程序員碼遞夫。 SpringBoot請求靜態資源時&#xff0c;request.getServletPath() 返回error&#xff0c; 明明我的目錄文件是存在的怎么就報錯了呢&#xff1f; 如我請求 http://127.0.0.1:9090/Hanfu/upload/1647161536390.png 通常是因為請求的資…

在開發板上如何處理curl: (60) SSL certificate problem

目錄 引言 問題解析 解決方法 跳過證書驗證 采用證書認證 結語 引言 最近一直推薦學生們在課程實驗中使用curl及其libcurl。curl 是一個強大的命令行工具&#xff0c;用于在命令行中進行數據傳輸。它支持多種協議&#xff0c;如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。…

CSRF請求偽造

該漏洞主要是關乎于用戶&#xff0c;告誡用戶不可亂點擊鏈接&#xff0c;提升自我防范&#xff0c;才能不落入Hacker布置的陷阱&#xff01; 1. cookie與session 簡單理解一下兩者作用 1.1. &#x1f36a; Cookie&#xff1a;就像超市的會員卡 存儲位置&#xff1a;你錢包里…

Python循環與遍歷詳解:從入門到進階

在Python編程中&#xff0c;循環和遍歷是最基礎但極其重要的知識點。理解并掌握這部分內容&#xff0c;是編寫高效、清晰代碼的前提。本文將從for循環和while循環的基本語法出發&#xff0c;逐步深入探討range、enumerate、zip、列表推導式、字典遍歷等Python中常見的遍歷技巧&…

Python-MCPServer開發

Python-MCPServer開發 使用FastMCP開發【SSE模式的MCPServer】&#xff0c;熟悉【McpServer編碼過程】【McpServer調試方法】 1-核心知識點 1-熟悉【SSE模式的MCPServer】開發2-熟悉【stdio模式的MCPServer】開發3-熟悉【啟動MCPServer】的三種方式 3.1-直接啟動:python mcp_s…

高級項目管理

在信息系統項目管理工作中&#xff0c;組織管理者和項目管理者&#xff0c;有時還會面臨多項目的管理&#xff0c;或組織級的項目管理、項目的量化管理等課題。 其中&#xff0c;項目集管理、項目組合管理和組織級項目管理&#xff0c;為多項目管理和組織級管理提供有效指導&a…

tarjan縮點+強聯通分量

【模板】縮點https://www.luogu.com.cn/problem/P3387 首先我們要理解這道題為什么要用縮點 題目說的是有向圖&#xff0c;如果無環的話就可以用DP來解決了 由于可以走重復的點&#xff0c;所以一個環上的點可以看成是一個點&#xff0c;它的點權就等于該環上所有點的點權之…

OSCP:獲取全交互式 Windows 反向 Shell

簡介 在本文中&#xff0c;我們將探討獲取完全交互式 Windows 反向 Shell 的各種方法&#xff0c;從利用內置工具到采用先進技術以獲得更好的控制和功能。 通過 Invoke-ConPtyShell 我獲取完全交互式 Windows 反向 Shell 的首選方法是通過 Invoke-ConPtyShell 腳本。當 Wind…

免費超好用的電腦操控局域網內的手機(多臺,無線)

使用 第一步 解壓QtScrcpy壓縮包&#xff0c;并運行QtScrcpy.exe 第二步 2.1 手機開啟開發者模式&#xff08;設置>關于本機>版本信息>連點10下“版本號”&#xff09; 2.2 開啟 USB調試 和 無線調試&#xff08;設置>開發者選項> USB調試 無線調試&#xf…

Go語言內存管理

本章節&#xff0c;就來學習一下go語言的內存模型&#xff0c;看一下內存的分配&#xff0c;存儲都是如何實現的&#xff0c;與此同時&#xff0c;在正式開始今天的主題之前&#xff0c;首先先來學習操作系統基于這一方面的內容&#xff0c;來看看是如何管理內存的吧 本章及節…

【docker】啟動臨時MongoDB容器、掛載數據卷運行數據庫服務,并通過備份文件恢復MongoDB數據庫備份數據

?啟動臨時 MongoDB 容器、掛載數據卷運行數據庫服務&#xff0c;并通過備份文件恢復數據 1.命令分解與功能說明1.1.啟動一個臨時 MongoDB 容器?&#xff0c;并進入交互式終端&#xff08;1&#xff09;執行命令&#xff08;2&#xff09;實現功能?&#xff08;3&#xff09;…

【最新 MCP 戰神手冊 08】工具使用詳解:實現 AI 行動

文章目錄 1. 開始啦!2. 第一部分:設計高效且安全的工具3. 第二部分:定義工具藍圖——參數、輸出與約束條件4. 第三部分:彌合差距:LLM 兼容性(函數調用)5. 第四部分:實施與測試的最佳實踐1. 開始啦! 在前幾章中,我們將工具介紹為 AI 模型在 MCP 客戶端引導下向 MCP 服…

介紹 IntelliJ IDEA 快捷鍵操作

IntelliJ IDEA 快捷鍵操作 1. 編輯與導航2. 查找與替換3. 調試與運行4. 導航與視圖5. 重構與生成6. 高級快捷鍵&#xff08;提高效率&#xff09;注意事項 IntelliJ IDEA 是一款功能強大的集成開發環境&#xff0c;掌握其常用快捷鍵可以顯著提升開發效率。但是有些小伙伴并不清…

Javascript 中作用域的理解?

一、作用域的類型 1. 全局作用域&#xff08;公司大門外&#xff09; 范圍&#xff1a;整個 JavaScript 文件變量&#xff1a;像貼在公告欄上的信息&#xff0c;所有人可見例子&#xff1a;const companyName "阿里"; // 全局變量&#xff0c;任何地方都能訪問 fu…

Leetcode刷題記錄22——滑動窗口最大值

題源&#xff1a;https://leetcode.cn/problems/sliding-window-maximum/description/?envTypestudy-plan-v2&envIdtop-100-liked 題目描述&#xff1a; 思路一&#xff1a; 暴力遍歷法&#xff0c;通過一個長度為k的滑動窗口遍歷nums&#xff0c;將其中最大的數依次記…

Apache Flink的架構設計與運行流程說明

在大數據領域&#xff0c;實時計算的重要性隨著業務需求的爆發式增長愈發凸顯。從電商的實時銷量監控到金融的高頻交易風控&#xff0c;從物聯網設備的實時告警到社交平臺的熱點追蹤&#xff0c;企業對“秒級甚至毫秒級”數據處理能力的需求已成為剛需。在眾多實時計算框架中&a…