每日算法-250430

每日算法 - 2025年4月30日

記錄下今天解決的兩道題目。


870. 優勢洗牌 (Advantage Shuffle)

題目描述

題目截圖

解題思路與方法

核心思想:貪心策略 (田忌賽馬)

這道題的目標是對于 nums1 中的每個元素,找到 nums2 中一個比它小的元素進行配對(如果可能),使得優勢配對的數量最大化。如果 nums1 中的某個元素找不到 nums2 中可以戰勝的對手,那么就用它去對付 nums2 中最強的對手,以保存 nums1 中更強的元素去對付 nums2 中可以戰勝的對手。這類似于經典的“田忌賽馬”策略。

具體步驟:

  1. 排序 nums1:將 nums1 升序排序,這樣我們可以從小到大處理 nums1 中的元素。
  2. 排序 nums2 的索引:我們不能直接排序 nums2,因為需要保留其原始元素的下標信息以構建最終結果 ret。因此,我們創建一個索引數組 indexs,存儲 0n-1。然后根據 nums2 中對應索引位置的元素值對 indexs 進行升序排序。排序后,indexs[0] 指向 nums2 中最小元素的原始索引,indexs[n-1] 指向 nums2 中最大元素的原始索引。
  3. 雙指針分配
    • 使用兩個指針 leftright 分別指向 indexs 數組的開始(對應 nums2 最小值)和結束(對應 nums2 最大值)。
    • 使用一個指針 i 遍歷排序后的 nums1 (從 i=0 開始)。
    • 比較 nums1[i] (當前 nums1 中最小的可用元素) 和 nums2[indexs[left]] (當前 nums2 中最小的未匹配元素)。
    • 如果 nums1[i] > nums2[indexs[left]]:說明 nums1[i] 可以戰勝 nums2 中當前最小的對手。這是一個優勢匹配。我們將 nums1[i] 分配給 nums2 中這個最小對手的原始位置,即 ret[indexs[left]] = nums1[i]。然后移動 left 指針 (left++),考慮 nums2 中下一個最小的對手。
    • 如果 nums1[i] <= nums2[indexs[left]]:說明 nums1[i]nums2 中當前最小的對手都無法戰勝。根據貪心策略,這個 nums1[i] 應該去對付 nums2 中最強的對手(反正也打不過,不如消耗掉對方最強的),以保留 nums1 中更強的元素。我們將 nums1[i] 分配給 nums2 中當前最大對手的原始位置,即 ret[indexs[right]] = nums1[i]。然后移動 right 指針 (right--),考慮 nums2 中下一個最大的對手。
    • 無論哪種情況,nums1[i] 都已經被使用,所以移動 i 指針 (i++) 處理 nums1 中的下一個元素。
  4. 循環繼續:重復步驟 3,直到 left > right,此時所有 nums1 中的元素都已分配完畢。
  5. 返回結果數組 ret

復雜度分析

  • 時間復雜度: O ( N log ? N ) O(N \log N) O(NlogN)。主要是排序 nums1indexs 數組所需的時間。雙指針遍歷過程是 O ( N ) O(N) O(N) 的。
  • 空間復雜度: O ( N ) O(N) O(N)。需要額外的空間存儲 indexs 數組和結果數組 ret

Code

class Solution {public int[] advantageCount(int[] nums1, int[] nums2) {int n = nums2.length;Integer[] indexs = new Integer[n];for (int i = 0; i < n; i++) {indexs[i] = i;}Arrays.sort(nums1);Arrays.sort(indexs, (a, b) -> (nums2[a] - nums2[b]));int left = 0, right = n - 1;int i = 0;int[] ret = new int[n];while (left <= right) {int index = 0;if (nums1[i] <= nums2[indexs[left]]) {index = indexs[right];right--;} else {index = indexs[left];left++;}ret[index] = nums1[i];i++;}return ret;}
}

3402. 使每一列嚴格遞增的最少操作次數 (Minimum Operations to Make Columns Strictly Increasing)

題目描述

題目截圖

解題思路與方法

核心思想:貪心策略

題目要求我們用最少的操作次數使得網格 grid 的每一列都嚴格遞增。對于每一列,我們需要確保 grid[j][i] > grid[j-1][i] 對所有 j > 0 成立。

為了使操作次數最少,當發現 grid[j][i] <= grid[j-1][i] 時,我們應該將 grid[j][i] 增加到剛好滿足嚴格遞增條件的最小值,即 grid[j-1][i] + 1

具體步驟:

  1. 初始化總操作次數 ret = 0
  2. 遍歷每一列:外層循環遍歷列索引 i0grid[0].length - 1
  3. 遍歷每一行的元素(從第二行開始):內層循環遍歷行索引 j1grid.length - 1
  4. 檢查條件:在每一列內部,比較當前元素 grid[j][i] 和它正上方的元素 grid[j-1][i]
  5. 執行操作
    • 如果 grid[j][i] <= grid[j-1][i],說明不滿足嚴格遞增條件。
    • 計算需要增加的值:increase = (grid[j-1][i] + 1) - grid[j][i]
    • 將這個增加的值累加到總操作次數 ret 中。
    • 關鍵:更新 grid[j][i] 的值grid[j-1][i] + 1。這一步非常重要,因為下一行的元素 grid[j+1][i] 需要和 更新后grid[j][i] 進行比較。
  6. 遍歷完所有列和行后,ret 就是所需的最小總操作次數。
  7. 返回 ret

復雜度分析

  • 時間復雜度: O ( R × C ) O(R \times C) O(R×C),其中 R 是網格的行數,C 是網格的列數。我們需要遍歷網格中的每個元素一次(除了第一行)。
  • 空間復雜度: O ( 1 ) O(1) O(1)。我們是在原地修改 grid(雖然題目可能沒要求必須原地修改,但這樣做不影響結果且節省空間),只需要常數級別的額外空間存儲變量 retij 等。

Code

class Solution {public int minimumOperations(int[][] grid) {int ret = 0;for (int i = 0; i < grid[0].length; i++) {for (int j = 1; j < grid.length; j++) {if (grid[j][i] <= grid[j - 1][i]) {ret += (grid[j - 1][i] + 1 - grid[j][i]);grid[j][i] = grid[j - 1][i] + 1;}}}return ret;}
}

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

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

相關文章

【MySQL】增刪改查(CRUD)

目錄 一. CRUD是什么 二. Create&#xff08;新增數據&#xff09; 2.1 單行數據全列插入 2.2 單行數據指定列插入 2.3 多行數據指定列插入 三. Retrieve &#xff08;檢索/查詢&#xff09; 3.1 全列查詢 3.2 指定列查詢 3.3 查詢字段為表達式 3.4 為查詢結果指定別名 3…

電商平臺 API 開發實戰:京東商品詳情數據實時獲取接口對接教程

在電商行業競爭日益激烈的當下&#xff0c;實時獲取商品詳情數據對于市場分析、競品監控、商品推薦等業務場景至關重要。京東作為國內領先的電商平臺&#xff0c;提供了強大的 API 接口&#xff0c;允許開發者獲取豐富的商品信息。本文將詳細介紹京東商品詳情數據實時獲取接口的…

YOLO視覺模型可視化訓練與推理測試工具

推薦一款YOLO可視化訓練測試工具: 對于yolo的訓練,新手小白往往無從下手,本章推薦的這款工具可以非常輕易的幫您從模型訓練到測試到部署。 下載地址http://www.voouer.com/yolo 可以點擊此處跳轉。 下載成功后打開這款工具,將會出現圖形化界面,類似于下圖所示: 當前頁是可視…

微調 LLaMA 2:定制大型語言模型的分步指南

微調 LLaMA 2&#xff1a;定制大型語言模型的分步指南 深入了解如何運用新技術在 Google Colab 平臺上對 Llama-2 進行微調操作&#xff0c;從而有效克服內存與計算方面的限制&#xff0c;讓開源大型語言模型變得更加易于獲取和使用。自從 Meta 發布了 LLaMA 的首個版本后&…

探秘明遠智睿SSD2351開發板在HMI領域的獨特魅力

人機界面&#xff08;HMI&#xff09;是人與機器進行交互的重要橋梁&#xff0c;其性能和用戶體驗直接影響到整個系統的使用效果。明遠智睿的SSD2351開發板憑借其出色的性能和豐富的功能&#xff0c;在HMI領域展現出了獨特的魅力。 SSD2351開發板的四核1.4GHz處理器具備強大的圖…

Keysight萬用表使用指南及基于Python采集數據生成Excel文件

文章目錄 說明使用的庫openpyxlpyvisa 代碼說明效果展示參考代碼 說明 本文介紹了 Keysight 34465A 的基本使用和 SCPI 指令設置&#xff0c;演示了使用 Python 的 PyVISA 庫控制兩臺 34465A 同時采集數據的完整流程&#xff0c;包括設置采樣參數、觸發測量、讀取數據、使用 O…

Docker 獲取 Python 鏡像操作指南

1. 安裝 Docker 環境 1.1 上傳安裝腳本&#xff08;Windows → Linux&#xff09; 在 Windows 的 CMD 中執行&#xff1a; scp docker.sh root10.1.1.58:~ 可自行前往我的飛書下載docker.sh腳本 Docs 1.2 在 Linux 中檢查文件 ls -l ~ # 確認 docker.sh 已上傳到家目錄…

JavaScript:從JS的執行機制到location對象

一、JS執行機制 &#xff08;1&#xff09;JS是單線程 JavaScript語言的一大特點就是單線程&#xff0c;也就是同一時間只能做一件事。因為JavaScript是為了處理頁面中的用戶交互&#xff0c;以及制作DOM二誕生的。比如我們對某個DOM元素進行添加和刪除操作&#xff0c;這個不…

iVX:數字化轉型全場景技術革新與生態構建實踐

在數字經濟蓬勃發展的當下&#xff0c;企業數字化轉型需求日益迫切。iVX 憑借其獨特的技術架構與創新解決方案&#xff0c;深度滲透工業互聯網、元宇宙、智慧城市等領域&#xff0c;成為推動全場景數字化轉型的重要力量。本文將重新梳理 iVX 的技術應用與生態價值&#xff0c;以…

生物化學筆記:神經生物學概論05 感受野 視覺中樞 高級視皮層中的信息走向

信息傳遞中的“擊鼓傳花” 新特性的突現 功能柱&#xff1a;簡化節點 高級視皮層中的信息走向

StarRocks Lakehouse 如何重構大數據架構?

隨著數據分析需求的不斷演進&#xff0c;企業對數據處理架構的期望也在不斷提升。在這一背景下&#xff0c;StarRocks 憑借其高性能的實時分析能力&#xff0c;正引領數據分析進入湖倉一體的新時代。 4 月 18 日&#xff0c;鏡舟科技高級技術專家單菁茹做客開源中國直播欄目《…

【SpringBoot】基于mybatisPlus的博客系統

1.實現用戶登錄 在之前的項目登錄中&#xff0c;我使用的是Session傳遞用戶信息實現校驗登錄 現在學習了Jwt令牌技術后我嘗試用Jwt來完成校驗工作 Jwt令牌 令牌一詞在網絡編程一節我就有所耳聞&#xff0c;現在又拾了起來。 這里講應用&#xff1a;令牌也就用于身份標識&a…

HCIP-security常見名詞

縮略語英文全稱解釋3DESTriple Data Encryption Standard三重數據加密標準AESAdvanced Encryption Standard高級加密標準AHAuthentication Header報文認證頭協議CACertification Authority證書頒發中心DESData Encryption Standard數據加密標準DHDiffie-Hellman密鑰交換算法DPD…

合并多個Excel文件到一個文件,并保留格式

合并多個Excel文件到一個文件&#xff0c;并保留格式 需求介紹第一步&#xff1a;創建目標文件第二步&#xff1a;創建任務列表第三步&#xff1a;合并文件第四步&#xff1a;處理合并后的文件之調用程序打開并保存一次之前生成的Excel文件第五步&#xff1a;處理合并后的文件之…

TDengine 中的壓縮設計

簡介 機器設備產生的時序數據量大&#xff0c;直接存儲成本非常高&#xff0c;所以需要使用壓縮技術&#xff0c;盡可能減小體積。 TDengine 使用了列式存儲&#xff0c;結合二級壓縮技術&#xff0c;壓縮率通常可以達到 20%&#xff0c;特殊情況下更能達到 5 % 以內&#xff…

深度學習涉及的數學與計算機知識總結

深度學習涉及的數學與計算機知識可總結為以下核心模塊&#xff0c;結合理論與實踐需求分為數學基礎和計算機技能兩大方向&#xff1a; 一、數學知識 線性代數 核心&#xff1a;矩陣運算&#xff08;乘法、轉置、逆矩陣&#xff09;、向量空間、特征值與特征向量、奇異值分解&am…

javascript<——>進階

一、作用域&#xff1a;變量可以被訪問的范圍 1.局部作用域 1.1函數作用域 在函數內部聲明的變量&#xff0c;在函數內部被訪問的&#xff0c;外部無法直接訪問。 總結&#xff1a;1、函數內部聲明的變量&#xff0c;在函數外部無法直接訪問 2、函數的參數也是函數內部的局…

驅動開發硬核特訓 · Day 25 (附加篇):從設備樹到驅動——深入理解Linux時鐘子系統的實戰鏈路

一、前言 在嵌入式Linux開發中&#xff0c;無論是CPU、外設控制器&#xff0c;還是簡單的GPIO擴展器&#xff0c;大多數硬件模塊都離不開時鐘信號的支撐。 時鐘子系統&#xff08;Clock Subsystem&#xff09;&#xff0c;作為Linux內核中基礎設施的一部分&#xff0c;為設備…

并發設計模式實戰系列(7):Thread Local Storage (TLS)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天為大家帶來的是并發設計模式實戰系列&#xff0c;第七章Thread Local Storage (TLS)&#xff0c;廢話不多說直接開始~ 目錄 一、核心原理深度拆解 1. TLS內存模型 2. 關鍵特性 二、生活化類比&a…

時序數據庫 TDengine × Perspective:你需要的可視化“加速器”

你有沒有遇到這樣的場景&#xff1a;數據已經寫進數據庫&#xff0c;圖表卻總是“慢半拍”&#xff1f;或是操作界面太卡&#xff0c;光是一個排序就能讓你等到喝完一杯咖啡&#xff1f;當數據量越來越大、響應時間卻越來越長&#xff0c;開發者和用戶都不禁要問一句——就沒有…