【LeetCode 每日一題】2749. 得到整數零需要執行的最少操作數

Problem: 2749. 得到整數零需要執行的最少操作數

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(1)
    • 空間復雜度:O(1)

整體思路

這段代碼旨在解決一個具有數學和位運算性質的問題:給定兩個整數 num1num2,找到最小的正整數 k,使得 num1 可以表示為 k 個整數的和,其中每個整數的形式都是 num2 + 2^ii >= 0)。如果找不到這樣的 k,則返回 -1。

該算法將問題進行了巧妙的數學轉換,然后通過一個循環來枚舉檢驗所有可能的 k 值。

  1. 問題的數學轉換

    • 題目要求 num1 = (num2 + 2^{i_1}) + (num2 + 2^{i_2}) + ... + (num2 + 2^{i_k})
    • 將上式重新整理,可以得到 num1 = k * num2 + (2^{i_1} + 2^{i_2} + ... + 2^{i_k})
    • 進一步變形,我們得到 num1 - k * num2 = 2^{i_1} + 2^{i_2} + ... + 2^{i_k}
    • x = num1 - k * num2。問題就轉化為了:找到最小的正整數 k,使得 x 可以表示為 k 個 2的冪的和。
  2. x 的性質與約束

    • 一個正整數 x 可以表示為 m 個 2的冪的和,當且僅當 x 的二進制表示中 1 的個數(即 Long.bitCount(x)小于或等于 m,并且 x 本身 大于或等于 m
      • Long.bitCount(x) <= mLong.bitCount(x) 是將 x 表示為 2的冪的和所需的最少項數。例如,7 (111_2) = 4+2+1,最少需要3個2的冪。我們可以通過將一個大的2的冪拆分成兩個小的(如 2^i = 2^{i-1} + 2^{i-1})來增加項數。所以,只要 m 不小于最少項數,就總能湊出 m 項。
      • x >= m:因為每個 2的冪 2^i 至少是 1 (2^0),所以 m 個 2的冪的和至少是 m。因此 x 必須大于或等于 m
  3. 算法的枚舉與檢驗邏輯

    • 基于以上的轉換和性質,算法現在只需要找到最小的正整數 k,滿足以下兩個條件:
      a. x = num1 - k * num2 >= k
      b. Long.bitCount(x) <= k
    • 枚舉 k:代碼通過一個 for 循環,從 k=1 開始枚舉。
    • 循環上限:循環的上限設置為 60。這是一個基于 num1num2 的數據范圍(通常是 10^9 級別)得出的一個足夠大的、安全的上界。2^60 已經遠超 10^18,通常可以覆蓋 long 類型的計算范圍。
    • 檢驗:在每次循環中:
      • 計算 x = num1 - 1L * num2 * k。使用 long 類型是為了防止計算過程中發生整數溢出。
      • 檢查第一個條件 x < k。如果不滿足(注意代碼中是x<kcontinue,這等價于要求x>=k),則這個 k 無效,繼續嘗試下一個。
      • 計算 x 的二進制表示中 1 的個數 min = Long.bitCount(x)
      • 檢查第二個條件 k >= min。如果滿足,說明當前的 k 是一個有效的解。因為我們是從小到大枚舉 k,所以第一個找到的有效解就是最小的,直接 return k
  4. 無解情況

    • 如果循環結束(k 從 1 到 60 都試過了)還沒有找到一個有效的 k,那么就認為問題無解,返回 -1

完整代碼

class Solution {/*** 找到最小的正整數 k,使得 num1 可以表示為 k 個 (num2 + 2^i) 形式的整數之和。* @param num1 目標整數* @param num2 基礎整數* @return 最小的正整數 k,如果不存在則返回 -1*/public int makeTheIntegerZero(int num1, int num2) {// 循環枚舉所有可能的 k 值。// 上限 60 是一個基于數據范圍的經驗值,對于 int 范圍的 num1, num2 足夠。for (int k = 1; k <= 60; k++) {// 步驟 1: 根據數學轉換計算 x = num1 - k * num2// 使用 long 類型防止計算過程中溢出long x = 1L * num1 - 1L * num2 * k;// 步驟 2: 檢驗 k 是否滿足兩個核心條件// 條件 1: x 必須能被表示成 k 個 2的冪的和。// 一個必要條件是 x >= k (因為每個 2^i >= 1)。// 如果 x < k,則當前 k 無效,繼續下一個。if (x < k) {// 原代碼的 continue 邏輯可以合并到下面的 if 判斷中,// 即 if (x >= k && k >= min) { return k; }// 這里為了忠于原代碼結構,保持原樣。continue;}// 計算將 x 表示為 2的冪的和所需的最少項數int min = Long.bitCount(x);// 條件 2: 表示 x 所需的項數必須能夠湊成 k。// 這要求 k 必須大于或等于所需的最少項數 (min)。if (k >= min) {// 因為 k 是從小到大枚舉的,所以第一個滿足條件的 k 就是最小的。return k;}}// 如果循環結束仍未找到解,則返回 -1return -1;}
}

時空復雜度

時間復雜度:O(1)

  1. 循環:算法的核心是一個 for 循環,該循環的執行次數是一個固定的常數(從 1 到 60)。
  2. 循環內部操作
    • 在每次迭代中,執行的操作包括:長整型乘法、減法、Long.bitCount()、比較。
    • Long.bitCount() 方法在大多數現代CPU上都有對應的硬件指令(如 POPCNT),其執行時間可以認為是 O(1)。即使是軟件實現,其復雜度也與 long 的位數(64位)相關,是一個常數。
    • 因此,循環內部的所有操作都是常數時間的。

綜合分析
算法的執行時間是 (一個固定的常數次數) * (常數時間操作)。因此,其時間復雜度為 O(1)

空間復雜度:O(1)

  1. 存儲分析
    • 算法在執行過程中只使用了幾個基本類型的變量(k, x, min)。
    • 這些變量的數量是固定的,不隨輸入 num1num2 的大小而改變。

綜合分析
算法沒有使用任何與輸入規模成比例的額外數據結構。因此,其額外輔助空間復雜度為 O(1)

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

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

相關文章

安卓開發工程師中高級知識點 —— 系統底層安全方向

一、AIDL 通信 Android Interface Definition Language 基于 Binder 實現跨進程通信&#xff08;IPC&#xff09;&#xff0c;核心是通過定義接口生成代理類&#xff0c;屏蔽底層 Binder 通信細節 適用于跨進程服務調用&#xff08;如系統服務、多App協作&#xff09;。常見于后…

動環監控系統-機房高效運維

動環監控系統&#xff08;全稱為動力環境監控系統&#xff09;是機房高效運維的核心工具&#xff0c;通過集成動力、環境、安防、IT設備等模塊&#xff0c;結合智能告警、AI分析、3D可視化等技術&#xff0c;實現機房的全方位監控與管理。動力系統監控供電設備&#xff1a;實時…

知微傳感Dkam系列3D相機SDK例程篇:CSharp設置相機工作模式

設置3D相機觸發模式 寫在前面 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有&#xff1a; 1、便利他人應用3D相機&#xff0c;本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋&#xff1b;2、促進行業發展及交流。設置觸發模式及API說明 觸發模式說明 知…

PHP 常用函數及用法

文章目錄PHP 常用函數及用法一、字符串處理函數1. 字符串基礎操作2. 字符串查找與替換3. 字符串分割與連接4. 字符串大小寫轉換5. 字符串格式化二、數組操作函數1. 數組基礎操作2. 數組遍歷與查找3. 數組修改與排序4. 數組過濾與合并三、文件操作函數1. 文件讀寫2. 文件和目錄信…

yum命令--obsoletes與--allowerasing兩者的區別

在 YUM&#xff08;Yellowdog Updater Modified&#xff09;包管理工具中&#xff0c;–obsoletes 和 --allowerasing 是兩個與包升級 / 安裝相關的選項&#xff0c;它們的功能和使用場景有明顯區別&#xff1a; 1. --obsoletes&#xff08;默認啟用&#xff09;作用&#xff1…

Day24_【深度學習(3)—PyTorch使用(1)—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 &#xff08;最重要&#xff09;torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

阿里云圖像編輯大模型開發部署

與阿里云一起輕松實現數智化讓算力成為公共服務&#xff1a;用大規模的通用計算&#xff0c;幫助客戶做從前不能做的事情&#xff0c;做從前做不到的規模。讓數據成為生產資料&#xff1a;用數據的實時在線&#xff0c;幫助客戶以數據為中心改變生產生活方式創造新的價值。圖像…

查看磁盤分區并新建一個分區,掛載分區

linux系統磁盤df -h查看文件系統的磁盤的空間占用情況&#xff0c;常用于快速檢查磁盤使用率&#xff1a;df -h-h是說把磁盤空間以G位單位&#xff0c;如果直接用df也是可以的&#xff0c;只不過單位是塊&#xff0c;看的不明顯du -sh /home/查看/home目錄下總共占用了多大的空…

vscode單擊暫時預覽文件 雙擊持續打開文件

直接單擊文件列表中的文件&#xff0c;會在編輯器中以預覽模式打開 文件標簽會顯示為斜體&#xff0c;表示是預覽狀態 當您單擊另一個文件或開始編輯時&#xff0c;預覽文件會自動關閉 在 settings.json 中添加&#xff0c;mac通過cmd,實現。 json {"workbench.editor.ena…

設計模式-橋接模式04

什么是橋接模式&#xff1f; 橋接模式就是把事物的兩個方面&#xff08;兩個變化的維度&#xff09;分開管理&#xff0c;讓它們可以分別自由變化&#xff0c;然后通過一個“橋”把它們連接起來。舉個生活中的例子 想象一下你在買鞋子&#xff1a; 鞋子有不同的款式&#xff08…

群暉企業級NAS :從中小企業效率工具到核心業務數據基石

在數字化轉型加速的今天&#xff0c;數據已成為企業最核心的資產。全球超半數財富 500 強企業選擇群暉&#xff08;Synology&#xff09;作為數據管理伙伴&#xff0c;其企業級 NAS 解決方案憑借 DSM 操作系統的生態優勢、硬件與軟件的深度協同&#xff0c;以及覆蓋全場景的產品…

C++訪問限定符private、public、protected的使用場景

C 訪問控制關鍵字&#xff1a;public、private、protected 在C中&#xff0c;public、private和protected是訪問控制關鍵字&#xff0c;用于實現面向對象編程的封裝特性&#xff0c;控制類成員的訪問權限。 訪問控制關鍵字的使用場景 1. public&#xff08;公有成員&#xff09…

CKA08--PVC

Task mariadb namespace 中的 MariaDB Deployment 被誤刪除。請恢復該 Deployment 并確保數據持久性。 請按照以下步驟&#xff1a; 如下規格在 mariadb namespace 中創建名為 mariadb 的 PersistentVolumeClaim (PVC)&#xff1a; 訪問模式為 ReadWriteOnce 存儲為 250Mi 集群…

Freertos系列(調度機制與創建任務)

如果不想看的可以直接使用git把我的代碼下載出來&#xff0c;里面工程挺全的&#xff0c;后期會慢慢的補注釋之類的 碼云地址&#xff1a;stm32學習筆記: stm32學習筆記源碼 如果不會使用git快速下載可以選擇直接下載壓縮包或者去看看git的使用 Git入門教程-CSDN博客 一 調…

C++中std::vector Vs std::deque VS std::list對比詳解

1) 核心差異速覽 std::vector&#xff1a;連續內存、隨機訪問 O(1)、尾部 push_back 攤還 O(1)、中間插入/刪除 O(n)&#xff0c;非常緩存友好。std::deque&#xff1a;分段&#xff08;block&#xff09;存儲&#xff0c;不是整體連續&#xff1b;隨機訪問 O(1)&#xff08;但…

【js】js實現日期轉大寫:

文章目錄一、方法&#xff1a;二、使用效果&#xff1a;一、方法&#xff1a; export function dateToChnese(strDate) {let dateMap {year: "",month: "",day: ""}if (!strDate || strDate.length 0) return dateMap;const chineseDigit [&…

逆向 js

參考地址&#xff1a;https://blog.csdn.net/2302_80243887/article/details/146349209 注意事項 1. crypto-js 安裝 需要你的.js文件同級目錄執行npm install crypto-js 才能讓js文件引入包 注意事項2&#xff1a; crypto-js 執行js 報錯_external_runtime.py" A…

FFmpeg的安裝及簡單使用

簡介 FFmpeg 是一個跨平臺的音視頻處理工具庫/命令行工具&#xff0c;其核心作用是&#xff1a;對音視頻文件或流進行解碼、轉換&#xff08;編碼&#xff09;、封裝/解封裝等處理。 友情提示 本次安裝以Windows64位操作系統為例 一、下載及安裝 1、前往FFmpeg官網&#xff0…

Science Advances--3D打印生物啟發扭曲雙曲超材料,用于無人機沖擊緩沖和自供電實時傳感

湍流引起的振動會對飛機的結構完整性及飛行穩定性造成巨大威脅&#xff0c;尤其是在無人駕駛飛行器&#xff08;UAV&#xff09;中&#xff0c;實時的沖擊監測和輕質防護尤為重要。該研究基于生物啟發&#xff0c;通過3D 打印尼龍PA12 制備了一種扭轉-雙曲面超材料&#xff08;…

AI大模型的研發流程

開發一個大模型是一個龐大、復雜且資源密集的系統工程&#xff0c;涉及算法研究、工程實現、數據管理和算力基礎設施等多個層面。下面我將為您提供一個從零開始開發大模型的全景式路線圖&#xff0c;涵蓋了從概念到部署的全過程。請注意&#xff0c;完全從零開始訓練一個類似GP…