leetcode 3224. 使差值相等的最少數組改動次數

題目鏈接:3224. 使差值相等的最少數組改動次數

題目:

給你一個長度為 n 的整數數組 nums ,n 是偶數 ,同時給你一個整數 k 。

你可以對數組進行一些操作。每次操作中,你可以將數組中任一元素替換為 0 到 k 之間的任一整數。

執行完所有操作以后,你需要確保最后得到的數組滿足以下條件:

存在一個整數 X ,滿足對于所有的 (0 <= i < n) 都有 abs(a[i] - a[n - i - 1]) = X 。
請你返回滿足以上條件最少修改次數。

提示:

2 <= n == nums.length <= 105

n 是偶數

0 <= nums[i] <= k <= 105

題解:

方法一:暴力解法

直接枚舉 X 的取值,然后計算每個枚舉值對應所需修改的次數,然后選出里面最小的即可。

這里的第一個問題是 X 的取值范圍如何確定。從題目的提示內容可知數組中的數在 0-k 之間,又因為 數組中的數字可以修改為 0-k之間的任意數,所以直接上 X 的取值范圍為 0 <= X <= k

第二個問題是如何讓數組中對稱位置的兩個數字在修改之后差值為 X,這里直接枚舉兩個數字可以修改的所有值,如果修改前后的數值不同則記錄為1次修改,否則不記錄為修改。

代碼實現:

def minChanges(nums, k):n = len(nums)change_count = [0] * (k + 1)# 遍歷前半部分for i in range(n // 2):a, b = nums[i], nums[n - i - 1]temp = [float('inf')] * (k + 1)  # 臨時數組,用于計算當前的最小修改次數# 遍歷每個可能的 Xfor x in range(k + 1):# 當前 |a - b| 與目標 X 的差異for v1 in range(k + 1):  # 枚舉將 a 修改為 v1for v2 in range(k + 1):  # 枚舉將 b 修改為 v2if abs(v1 - v2) == x:  # 如果調整后符合要求cost = (v1 != a) + (v2 != b)  # 計算修改次數temp[x] = min(temp[x], change_count[x] + cost)# 更新最小修改次數change_count = tempreturn min(change_count)

方法二:差分數組

注意到每一對數不會互相影響,所以可以把每一對數分開考慮。
設一對數中,一個是 x x x,一個是 y y y,那么改掉其中一個數可以獲得的最大差值,肯定是把另一個數改成 0 或 k,即最大差值:

m = m a x ( x , k ? x , y , k ? y ) m=max(x, k-x, y, k-y) m=max(x,k?x,y,k?y)

參考下表:

xy差值
x0x
xkk-x
0yy
kyk-y

改掉兩個數,那就可以獲得從 0 到 k 里的任意差值。

所以對于這一對數來說, X = ∣ x ? y ∣ X=|x-y| X=x?y 時不需要操作, 0 ≤ X < ∣ x ? y ∣ 0 \leq X < |x-y| 0X<x?y 以及 ∣ x ? y ∣ < X ≤ m |x-y| < X \leq m x?y<Xm 的時候需要一次操作, X > m X>m X>m 的時候需要兩次操作。

枚舉所有數對,用差分數組維護 X X X 的某個取值需要幾次操作即可。復雜度 O ( n + k ) O(n+k) O(n+k)

  • 我們令 d = a b s ( n u m s [ i ] ? n u m s [ j ] ) d=abs(nums[i]-nums[j]) d=abs(nums[i]?nums[j]),假如最后的這個 0 ≤ X < ∣ x ? y ∣ 0 \leq X < |x-y| 0X<x?y,那么就可以通過一次操作完成。
  • 操作一次能達到的最大差值是多少呢?這個就是上面說的肯定是把另一個數改成 0 或 k。即最大差值為 m = m a x ( x , k ? x , y , k ? y ) m=max(x, k-x, y, k-y) m=max(x,k?x,y,k?y),那么就是 ∣ x ? y ∣ < X ≤ m |x-y| < X \leq m x?y<Xm 時需要一次操作。
  • 剩下就是 X > m X > m X>m 時需要兩次操作。

因為是對區間內的值進行統一的加一個常數的操作,如果一個一個操作的話時間復雜度為 O ( n ) O(n) O(n),所以使用了差分數組,這樣可以將時間復雜度降為 O ( 1 ) O(1) O(1)

from typing import Listclass Solution:def minChanges(self, nums: List[int], k: int) -> int:n = len(nums)f = [0] * (k + 2)i, j = 0, n - 1while i < j:d = abs(nums[i] - nums[j])ma = max(nums[i], k - nums[i], nums[j], k - nums[j])# 0 <= x < d 時需要一次操作,如果沒有用差分數組的話就成了 cnt[0]+1,cnt[1]+1,···,cnt[d]+1f[0] += 1f[d] -= 1# d < x <= ma 時需要一次操作f[d + 1] += 1f[ma + 1] -= 1# x > ma 時需要兩次操作f[ma + 1] += 2i += 1j -= 1ans = f[0]for i in range(1, k + 2):f[i] += f[i - 1]ans = min(ans, f[i])return ans

參考1:3224. 使差值相等的最少數組改動次數
參考2:前綴和&差分

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

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

相關文章

Y3編輯器文檔4:觸發器1(對話、裝備、特效、行為樹、排行榜、不同步問題)

文章目錄 一、觸發器簡介1.1 觸發器界面1.2 ECA語句編輯及快捷鍵1.3 參數設置1.4 變量設置1.5 實體觸發器1.6 函數庫與觸發器復用 二、觸發器的多層結構2.1 子觸發器&#xff08;在游戲內對新的事件進行注冊&#xff09;2.2 觸發器變量作用域2.3 復合條件2.4 循環2.5 計時器2.6…

前端WebSocket應用——聊天實時通信的基本配置

使用 WebSocket 實現實時通信的 Vue 應用 前言1. WebSocketService 類 1.1 類屬性1.2 構造函數和連接初始化1.3 WebSocket 連接1.4 事件處理方法1.5 發送和關閉 WebSocket 消息1.6 狀態查詢與回調注冊1.7 完整代碼 2. 在 Vue 組件中使用 WebSocketService 2.1 定義 WebSocket …

【開源】A065—基于SpringBoot的庫存管理系統的設計與實現

&#x1f64a;作者簡介&#xff1a;在校研究生&#xff0c;擁有計算機專業的研究生開發團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看項目鏈接獲取??&#xff0c;記得注明來意哦~&#x1f339; 贈送計算機畢業設計600個選題ex…

基于python實現自動化的驗證碼識別:探索與實踐

基于python實現自動化的驗證碼識別&#xff1a;探索與實踐 一、驗證碼的類型及特點&#xff08;一&#xff09;圖像驗證碼&#xff08;二&#xff09;短信驗證碼&#xff08;三&#xff09;語音驗證碼 二、驗證碼識別的方法*&#xff08;一&#xff09;傳統圖像處理方法&#x…

Vue vs. React:兩大前端框架的深度對比與分析(一)

前言 在當今快速發展的前端領域中&#xff0c;Vue和React作為兩個備受矚目的前端框架&#xff0c;已經成為許多開發者的首選。這兩個框架憑借其出色的設計和強大的功能&#xff0c;在構建現代化、高效性能的Web應用方面扮演著重要角色。 Vue和React都以其獨特的特點吸引了眾多開…

windows安裝使用conda

在Windows系統上安裝和使用Conda的詳細步驟如下&#xff1a; 一、下載Conda安裝包 訪問Conda的官方網站Anaconda | The Operating System for AI&#xff0c;點擊“Downloads”按鈕。在下載頁面&#xff0c;選擇適合您系統的安裝包。通常&#xff0c;對于Windows系統&#xf…

websocket 服務 pinia 全局配置

websocket 方法類 // stores/webSocketStore.ts import { defineStore } from "pinia";interface WebSocketStoreState {ws: WebSocket | null; // WebSocket 實例callbacks: ((message: string) > void)[]; // 消息回調函數列表connected: boolean; // 連接狀態…

Ariba Procurement: Administration_Cloud Basics

# SAP Ariba Procurement: Administration_Cloud Basics 認識Ariba Cloud SAP Ariba Procurement 是一個云計算平臺… The Ariba Cloud 平臺需要簡單理解的概念: Datacenter數據中心:SAP Ariba在世界各地有許多數據中心。這些數據中心構成了Ariba云的基本物理基礎設施。 …

vulnhub靶場【shenron】--1

前言 靶機&#xff1a;shenron-1 攻擊&#xff1a;kali 都采用虛擬機&#xff0c;網卡為橋接模式 主機發現 使用arp-scan -l或netdiscover -r 192.168.1.1/24掃描 信息收集 使用nmap掃描端口 網站信息探測 查看頁面&#xff0c;發現是apache2的默認界面&#xff0c;查看…

等保2.0數據庫測評之SQL server數據庫測評

一、SQL server數據庫介紹 SQL server美國Microsoft公司推出的一種關系型數據庫系統。SQL Server是一個可擴展的、高性能的、為分布式客戶機/服務器計算所設計的數據庫管理系統。 本次安裝環境為Windows10專業版操作系統&#xff0c;數據庫版本為Microsoft SQL Server 2019 (…

無人機之報警器的工作原理!

一、電量監測技術 電量監測是無人機電量指示和報警功能的基礎。通過實時監測無人機的電池電量&#xff0c;系統能夠準確判斷電池的剩余使用時間&#xff0c;并在電量不足時發出報警。電量監測技術通常包括以下幾個方面&#xff1a; 電壓檢測&#xff1a;無人機電池內部通常配…

【pyspark學習從入門到精通23】機器學習庫_6

目錄 分割連續變量 標準化連續變量 分類 分割連續變量 我們經常處理高度非線性的連續特征&#xff0c;而且只用一個系數很難擬合到我們的模型中。 在這種情況下&#xff0c;可能很難只通過一個系數來解釋這樣一個特征與目標之間的關系。有時&#xff0c;將值劃分到離散的桶中…

解密時序數據庫的未來:TDengine Open Day技術沙龍精彩回顧

在數字化時代&#xff0c;開源已成為推動技術創新和知識共享的核心力量&#xff0c;尤其在數據領域&#xff0c;開源技術的涌現不僅促進了行業的快速發展&#xff0c;也讓更多的開發者和技術愛好者得以參與其中。隨著物聯網、工業互聯網等技術的廣泛應用&#xff0c;時序數據庫…

QT 使用共享內存 實現進程間通訊

QSharedMemory&#xff1a;如果兩個進程運行在同一臺機器上&#xff0c;且對性能要求非常高&#xff08;如實時數據共享、圖像渲染等&#xff09;&#xff0c;建議使用共享內存。 優點&#xff1a; 高性能&#xff1a; 共享內存是進程間通信的最快方式之一&#xff0c;因為數…

在Scala中對隱式轉換格式與作用

隱式對象 格式&#xff1a;implicit object 作用&#xff1a;給函數的默認參數提供隱式值 object Scala12______10 { // case class DataBase(driver: String, url: String) // // implicit object mySql extends DataBase("mysql", "localhost:300") //…

go build command

文章目錄 1.簡介2.格式3.選項4.示例5.小結參考文獻 1.簡介 go build 是 Go 語言工具鏈中的一個命令&#xff0c;它用于編譯 Go 源代碼并生成可執行文件。 2.格式 go build [-o output] [build flags] [packages]可選的 -o 選項強制 build 將生成的可執行文件或對象寫入指定的…

OpenCV實驗:圖片加水印

第二篇&#xff1a;圖片添加水印&#xff08;加 logo&#xff09; 1. 實驗原理 水印原理&#xff1a; 圖片添加水印是圖像疊加的一種應用&#xff0c;分為透明水印和不透明水印。水印的實現通常依賴于像素值操作&#xff0c;將水印圖片融合到目標圖片中&#xff0c;常用的方法…

WinDbg 中使用 !process 命令

PROCESS 81a979d0 SessionId: 0 Cid: 0210 Peb: 7ffda000 ParentCid: 063cDirBase: 145b9000 ObjectTable: e12fed70 HandleCount: 53.Image: Dbgview.exe 1. PROCESS 81a979d0 意義&#xff1a;PROCESS 是該進程對象的內核地址。用途&#xff1a;可以使用這個地址獲…

深入解析下oracle的number底層存儲格式

oracle數據庫中&#xff0c;number數據類型用來存儲數值數據&#xff0c;它既可以存儲負數數值&#xff0c;也可以存儲正數數值。相對于其他類型數據&#xff0c;number格式的數據底層存儲格式要復雜得多。今天我們就詳細探究下oracle的number底層存儲格式。 一、環境搭建 1.…

SparkSQL與Hive的整合

文章目錄 SparkSQL與Hive的整合1.1. Spark On Hive1.1.1. Hive的準備工作1.1.2. Spark的準備工作1.1.3. Spark代碼開發1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查詢引擎1.4.1. 開啟ThriftServer服務1.4.2. beeline連接ThriftServer…