每日算法-250425

每日算法打卡 - 2025年4月25日

記錄今天完成的幾道 LeetCode 算法題,分享解題思路和代碼。


2178. 拆分成最多數目的正偶數之和

題目
題目截圖 2178

解題思路

貪心算法

解題過程

題目要求我們將一個偶數 finalSum 拆分成盡可能多的 不同 正偶數之和。

為了使拆分出的數字數量最多,我們應該盡可能選擇小的偶數。因此,可以采用貪心策略:從最小的正偶數 2 開始,依次嘗試添加 4, 6, 8, …,并不斷更新剩余的 finalSum

具體步驟如下:

  1. 初始化一個空列表 ret 用于存放結果。
  2. 首先判斷 finalSum 是否為偶數,如果不是,無法拆分,直接返回空列表。
  3. 使用一個變量 i 從 2 開始,表示當前嘗試添加的偶數。
  4. 進入循環,只要 finalSum 大于 0:
    a. 嘗試從 finalSum 中減去當前的偶數 i
    b. 關鍵一步:檢查減去 i 后的 finalSum。如果 finalSum <= i,這意味著剩余的 finalSum 不足以讓我們在下一步添加 i+2(因為需要不同的偶數,且 i+2 > i >= finalSum),或者剛好等于 i(如果加上 i 會導致重復)。為了用盡 finalSum 并保證得到最多數量的偶數,我們將這個剩余的 finalSum 加到當前的 i 上,形成 i + finalSum_remaining。這個合并后的值將是最后一個加入列表的數。然后將 finalSum 設為 0,表示總和已完全分配。
    c. 將(可能被調整過的)i 添加到結果列表 ret 中。
    d. 將 i 增加 2,準備處理下一個偶數。
  5. finalSum 變為 0 時,循環結束,返回列表 ret

這種方法確保了每次都取最小的可用偶數,從而最大化了偶數的數量,并且通過最后一步的合并操作保證了所有數都是不同的正偶數且總和恰好為 finalSum

復雜度分析

  • 時間復雜度: O ( f i n a l S u m ) O(\sqrt{finalSum}) O(finalSum ?)。 我們依次添加 2, 4, 6, …, k。這些數的和大約是 k 2 / 2 k^2 / 2 k2/2。當和達到 finalSum 時停止,所以 k 2 ≈ 2 × f i n a l S u m k^2 \approx 2 \times finalSum k22×finalSum, 即 k ≈ 2 × f i n a l S u m k \approx \sqrt{2 \times finalSum} k2×finalSum ?。循環的次數與 k k k 成正比,因此時間復雜度為 O ( f i n a l S u m ) O(\sqrt{finalSum}) O(finalSum ?)
  • 空間復雜度: O ( f i n a l S u m ) O(\sqrt{finalSum}) O(finalSum ?)。 結果列表 ret 最多存儲約 f i n a l S u m \sqrt{finalSum} finalSum ? 個數。

Code

class Solution {public List<Long> maximumEvenSplit(long finalSum) {List<Long> ret = new ArrayList<>();if (finalSum % 2 != 0) {return ret;}long i = 2;while (finalSum > 0) {finalSum -= i;if (finalSum <= i) {i += finalSum;finalSum = 0;}ret.add(i);i += 2;}return ret;}
}

2567. 修改兩個元素的最小分數

題目
題目截圖 2567

解題思路

貪心

解題過程

題目要求我們通過修改數組中的兩個元素,使得數組的“分數”(最大值與最小值的差)最小。我們有兩次修改機會。

為了最小化最大值與最小值的差,最優的修改策略總是將待修改的元素值改為與數組中某個“目標”元素相等。由于我們可以修改兩個數,我們可以考慮以下幾種情況來消除極端值對分數的影響:

  1. 修改兩個最大值: 將數組中最大的兩個元素修改成與最小值 nums[0] 相等(或者修改成任何小于等于 nums[n-3] 的值)。修改后,數組的實際最大值為 nums[n-3],最小值為 nums[0]。分數是 nums[n-3] - nums[0]
  2. 修改兩個最小值: 將數組中最小的兩個元素修改成與最大值 nums[n-1] 相等(或者修改成任何大于等于 nums[2] 的值)。修改后,數組的實際最小值為 nums[2],最大值為 nums[n-1]。分數是 nums[n-1] - nums[2]
  3. 修改一個最大值和一個最小值: 將最小值 nums[0] 修改成 nums[1](或更大),并將最大值 nums[n-1] 修改成 nums[n-2](或更小)。修改后,數組的實際最小值為 nums[1],最大值為 nums[n-2]。分數是 nums[n-2] - nums[1]

這三種情況涵蓋了通過兩次修改來最小化 max - min 的所有有效策略。因為我們總是希望消除最大的數或最小的數對分數的影響。

因此,我們首先對數組進行排序,然后計算上述三種情況對應的分數,取其中的最小值即為答案。

復雜度分析

  • 時間復雜度: O ( N log ? N ) O(N \log N) O(NlogN),主要是數組排序所需的時間。
  • 空間復雜度: O ( log ? N ) O(\log N) O(logN) O ( 1 ) O(1) O(1),取決于排序算法使用的額外空間。

Code

class Solution {public int minimizeSum(int[] nums) {Arrays.sort(nums);int n = nums.length;int maxToMin = nums[n - 3] - nums[0];int minToMax = nums[n - 1] - nums[2];int maxToMinANDminToMax = nums[n - 2] - nums[1];return Math.min(maxToMinANDminToMax, Math.min(maxToMin, minToMax));}
}

1509. 三次操作后最大值與最小值的最小差

題目
題目截圖 1509

解題思路

貪心

解題過程

這道題與上一題類似,但我們有三次修改機會。目標仍然是最小化修改后數組的最大值與最小值的差。

同樣,最優策略是修改數組中的極端值(最大或最小的那些)。有三次修改機會,意味著我們可以“消除”數組排序后兩端的最多三個元素對最終 max - min 差值的影響。考慮以下四種消除極端值的情況:

  1. 修改最大的三個數: 將 nums[n-1], nums[n-2], nums[n-3] 修改掉。剩下的元素范圍是 [nums[0], nums[n-4]]。最小差值為 nums[n-4] - nums[0]
  2. 修改最小的三個數: 將 nums[0], nums[1], nums[2] 修改掉。剩下的元素范圍是 [nums[3], nums[n-1]]。最小差值為 nums[n-1] - nums[3]
  3. 修改最小的兩個數和最大的一個數: 將 nums[0], nums[1]nums[n-1] 修改掉。剩下的元素范圍是 [nums[2], nums[n-2]]。最小差值為 nums[n-2] - nums[2]
  4. 修改最小的一個數和最大的兩個數: 將 nums[0], nums[n-1]nums[n-2] 修改掉。剩下的元素范圍是 [nums[1], nums[n-3]]。最小差值為 nums[n-3] - nums[1]

這四種情況覆蓋了所有最優的可能。因為要最小化差值,我們總是改變最大或最小端的元素。改變中間的元素不會比改變兩端的元素更優。

所以,先對數組排序。如果數組長度 n 小于或等于 4,我們總能通過三次修改使得所有元素相等,差值為 0。否則,計算上述四種情況的差值,返回其中的最小值。

復雜度分析

  • 時間復雜度: O ( N log ? N ) O(N \log N) O(NlogN), 瓶頸在于排序。
  • 空間復雜度: O ( log ? N ) O(\log N) O(logN) O ( 1 ) O(1) O(1), 取決于排序算法。

Code

class Solution {public int minDifference(int[] nums) {int n = nums.length;if (n <= 4) {return 0;}Arrays.sort(nums);int maxToMin = nums[n - 4] - nums[0];int minToMax = nums[n - 1] - nums[3];int firstTwo = nums[n - 2] - nums[2];int lastTwo = nums[n - 3] - nums[1];int one = Math.min(maxToMin, minToMax);int two = Math.min(firstTwo, lastTwo);return Math.min(one, two);}
}

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

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

相關文章

SQL進階知識:四、索引優化

今天介紹下關于索引優化的詳細介紹&#xff0c;并結合MySQL數據庫提供實際例子。 索引優化是數據庫性能優化的關鍵環節之一&#xff0c;尤其是在處理大量數據時。索引可以加快查詢速度&#xff0c;減少數據掃描范圍&#xff0c;但不當的索引設計也可能導致性能問題。以下是關于…

(PYTHON)函數

函數的基本概念&#xff1a; python中函數分為以下四種&#xff1a; 1&#xff0c;python內置函數&#xff1a;如abs&#xff0c;len&#xff0c;max&#xff0c;min&#xff1b; 2&#xff0c;標準庫函數&#xff1a;通過import聲明標準庫&#xff0c;如&#xff1a;math&a…

Winform(1.Winform控件學習)

使用的控件有:Button,Label,TextBox button:表示一個按鈕,用戶點擊按鈕觸發事件 click事件最常用 label:標簽,用于顯示文本 Name屬性:變量名稱 textBox:輸入框 Form1代碼: using System; using System.Collections.Generic; using System.ComponentModel; using Sys…

linux centOS7.9 No package docker-ce available

docker pull apache/apisix:3.2.2-centos Error response from daemon: missing signature key 處理方式如下&#xff1a; 問題&#xff1a;在純凈機里安裝docker時報錯No package docker-ce available。 解決辦法&#xff1a; 1、更新yum&#xff0c;使用yum -y upgrade&#…

小白學習java第15天:JDBC

1.數據庫驅動 想一下我們之前是怎么操作數據庫&#xff0c;是不是使用SQL語句對其mysql數據庫管理系統&#xff0c;然后管理系統在進行數據庫&#xff08;硬盤文件里面的&#xff09;進行操作。那么我現在想使用應用程序對其數據庫進行操作&#xff0c;應該怎么辦呢&#xff1…

django之數據的翻頁和搜索功能

數據的翻頁和搜素功能 目錄 1.實現搜素功能 2.實現翻頁功能 一、實現搜素功能 我們到bootstrap官網, 點擊組件, 然后找到輸入框組, 并點擊作為額外元素的按鈕。 我們需要使用上面紅色框里面的組件, 就是搜素組件, 代碼部分就是下面紅色框框出來的部分。 把這里的代碼復制…

Kotlin Multiplatform--02:項目結構進階

Kotlin Multiplatform--02&#xff1a;項目結構進階 引言正文 引言 在上一章中&#xff0c;我們對 Kotlin Multiplatform 項目有了基本的了解&#xff0c;已經可以進行開發了。但我們只是使用了系統默認的項目結構。本章介紹了如何進行更復雜的項目結構管理。 正文 在上一章中&…

【Git】連接github時的疑難雜癥(DNS解析失敗)

大家好&#xff0c;我是jstart千語。最近在將項目推送到github的時候&#xff0c;突然github就拒絕訪問了&#xff0c;即使掛了VPN&#xff0c;網頁也進不去&#xff0c;通過git也不能把代碼推送上去。 即使后面看別人的一些解決方案&#xff0c;比如取消代理啊、更換ssh的方式…

ViTMAE:掩碼自編碼器是可擴展的視覺學習者

摘要 本文展示了掩碼自編碼器&#xff08;MAE&#xff09;作為計算機視覺中的可擴展自監督學習方法。我們的MAE方法很簡單&#xff1a;我們對輸入圖像進行隨機掩碼&#xff0c;并重建缺失的像素。該方法基于兩個核心設計。首先&#xff0c;我們開發了一種非對稱的編碼器-解碼器…

全球碳化硅晶片市場深度解析:技術迭代、產業重構與未來賽道爭奪戰(2025-2031)

一、行業全景&#xff1a;從“材料突破”到“能源革命”的核心引擎 碳化硅&#xff08;SiC&#xff09;作為第三代半導體材料的代表&#xff0c;憑借其寬禁帶&#xff08;3.26eV&#xff09;、高臨界擊穿場強&#xff08;3MV/cm&#xff09;、高熱導率&#xff08;4.9W/cmK&…

AWS Glue ETL設計與調度最佳實踐

一、引言 在AWS Glue中設計和調度ETL過程時&#xff0c;需結合其無服務器架構和托管服務特性&#xff0c;采用系統化方法和最佳實踐&#xff0c;以提高效率、可靠性和可維護性。本文將從調度策略和設計方法兩大維度詳細論述&#xff0c;并輔以實際案例說明。 二、調度策略的最…

數據結構手撕--【二叉樹】

目錄 定義結構體&#xff1a; 初始化&#xff1a; 手動創建一個二叉樹&#xff1a; 前序遍歷&#xff1a; 中序遍歷&#xff1a; 后序遍歷 二叉樹節點個數&#xff1a; 葉子節點個數&#xff1a; 二叉樹第k層節點個數&#xff1a; 二叉樹的高度&#xff1a; 查找值為x…

2025 Java 開發避坑指南:如何避免踩依賴管理的坑?

在 Java 開發的世界里&#xff0c;依賴管理就像是一座看不見的橋梁&#xff0c;連接著項目所需的各種第三方庫和框架。然而&#xff0c;這座橋梁并非總是穩固&#xff0c;稍有不慎就可能掉入 “依賴地獄”&#xff0c;導致項目編譯失敗、運行異常。2025 年&#xff0c;隨著開源…

用node打開一個網頁

前言 使用node打開網頁&#xff0c;要求跨平臺 方案 使用子進程來用命令行打開網頁鏈接就可以了&#xff0c;需要注意的是Mac系統使用的是open命令&#xff0c;Windows系統使用的是start命令&#xff0c;Linux等系統使用xdg-open命令。針對不同的操作系統使用不同的命令。 封…

使用功能包組織C++節點的具體教程

在 ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;使用功能包&#xff08;package&#xff09;來組織 C 節點是一種常見且有效的方式&#xff0c;它能讓代碼結構更清晰、便于管理和復用。 1. 環境準備 確保已經安裝了 ROS&#xff0c;這里以 ROS 2 Humble…

二項式分布html實驗

二項式分布html實驗 本文將帶你一步步搭建一個純前端的二項分布 Monte-Carlo 模擬器。 只要一個 HTML 文件&#xff0c;打開就能運行&#xff1a; 動態輸入試驗次數 n、成功概率 p 與重復次數 m點擊按鈕立刻得到「模擬頻數 vs 理論頻數」柱狀圖隨著 m 增大&#xff0c;兩組柱狀…

通過 API 對接應用網絡商城實現訂單自動化

前言 API&#xff08;Application Programming Interface&#xff09;即應用程序編程接口&#xff0c;是一種允許不同軟件應用程序之間進行交互和數據共享的工具。它通過定義一組明確的規則和協議&#xff0c;使得各個軟件系統能夠以標準化的方式相互通信。 在支付領域&#x…

openwrt作旁路由時的幾個常見問題 openwrt作為旁路由配置zerotier 圖文講解

1 先看openwrt時間&#xff0c;一定要保證時間和瀏覽器和服務器是一致的&#xff0c;不然無法更新 2 openwrt設置旁路由前先測試下&#xff0c;路由器能否ping通主路由&#xff0c;是否能夠連接外網&#xff0c;好多旁路由設置完了&#xff0c;發現還不能遠程好多就是旁路由本…

FANUC機器人GI與GO位置數據傳輸設置

FANUC機器人GI與GO位置數據傳輸設置&#xff08;整數小數分開發&#xff09; 一、概述 在 Fanuc 機器人應用中&#xff0c;如果 IO 點位足夠&#xff0c;可以利用機器人 IO 傳輸位置數據及偏移位置數據等。 二、操作步驟 1、確認通訊軟件安裝 首先確認機器人控制柜已經安裝…

UE5 Assimp 自用

記錄一下配assimp庫到ue中的過程。因為想在ue里面實現一些幾何處理(雖然ue好像有相關的geo的代碼&#xff09;&#xff0c;遂配置了一下assimp。 1. 編譯整理生成自己所需要的文件。cmake編譯&#xff0c;下載github 的官方的assimp-master&#xff0c;然后cmake都是默認的就行…