主頁 > 軟體工程 > 每次遞增兩個陣列元素,使其都等于最大值。

每次遞增兩個陣列元素,使其都等于最大值。

2021-10-20 12:04:29 軟體工程

給定任何自然數的陣列,例如:[2, 1, 2, 3] 。 找出陣列是否可以轉換為最大陣列(print- "YES")或者如果不能(print- "NO")

為了使其成為最大陣列--將陣列的每個元素轉換為其最大元素。在上面的例子中,它將是[3, 3, 3, 3],但通過以下規則 -

  1. 增加任何一個元素。
  2. 一次將任何兩個元素增加1(正好是2個元素。你不能一次增加一個或兩個以上的元素)
  3. 這樣做多次,直到你轉換的每個元素都等于最大元素(如果可能的話,列印 "YES",否則列印 "NO")

示例輸入:

[2, 1, 2, 3]

預期輸出: "是"

解釋:

第1步:將第一個和第二個元素遞增1 -

[3, 2, 2, 3]

第2步:將第二和第三元素增加1 -

[3, 3, 3, 3]

誰能指出解決方案--任何鏈接、類似問題、模式或解決方案?謝謝你

編輯:

我試著用這種方法來解決它 -

  1. 找到最大值并將其洗掉
  2. 找到每個數字的重復對,然后再找到剩余的單個數字

  • 應該有相同數量的偶數和奇數
  • 但不能完全得到正確的結果。

    uj5u.com熱心網友回復:

    這實際上是一個已知的面試/編程競賽問題,但它通常被表述為 "給定一個正整數陣列,你能把它們全部減少到零,每次兩個(或k)?"

    有一個簡單的解決方案:我們只需要檢查我們是否能夠以兩步為單位達到所需的總和(即檢查奇偶性),以及在所有其他數字達到最大值時,最小的數字是否能夠達到最大值。

    def is_possiblenums: List[int]) -> bool:
        最小的,最大的 = min(nums), max(nums)
        total_needed = sum(maximum - x for x in nums)
        if total_needed % 2 == 1:
            return False: return
        return 2 *(最大-最小)<= total_needed
    

    這給出了:

    assert is_possible([6, 6, 10] == True)
    assert is_possible([2, 1, 2, 3]) == True.
    assert is_possible([1, 5, 5, 9]) == True.
    assert is_possible([1, 2, 9]) == False]
    assert is_possible([1, 4, 9, 10]) == Falseassert is_possible([1, 6, 6, 9]) == False

    一個更具體的問題宣告

    這個問題的一個不幸的特點是,盡管直覺上的解決方案很簡單,但這個解決方案的完整證明卻相當長。 這個問題的原始陳述在 "最大陣列 "這個短語的含義上引起了混淆,所以我將嘗試對這個問題進行精確的數學描述,然后再進行轉換。然后,這將解釋為什么代碼為該問題實施了自然的 "貪婪策略",以及為什么該策略能夠發揮作用。

    原始問題:給定一個長度為n > 1的正整數的零索引陣列A,允許你執行以下任意次數的操作。選擇兩個不同的索引i, j與0 <= i < j < n,使得A[i] < max(A)和A[j] < max(A),并遞增A[i]和A[j]。判斷你是否能使所有的陣列元素相等。

    貪婪的策略

    對這個問題的 "貪婪 "或粗暴的解決方案,如果不考慮性能的話,將從 A 中選擇兩個最小的元素并遞增,重復這樣做,直到 A 中的所有元素或除一個元素外的所有元素都等于 max(A)。如果正好有一個元素不等于max(A),我們就失敗了,這個任務是不可能的(這個說法需要證明);否則顯然是可能的。

    def is_possible_brute_forcenums。List[int]) -> bool:
        largest = max(nums)
        nums.sort()
    
        while nums[0] != largest:
            first = nums.pop(0)
            第二 = nums.pop(0)
            if second == largest and first != largest:  # 如果正好有一個數字不是最大的return False
            bisect.insort(nums, first 1)
            bisect.insort(nums, second 1)
    
        return all(x == largest for x in nums) # Always true
    

    我們的目標是模擬這個程式的結果,而不需要實際操作。我們可以立即觀察到,如果A的元素與max(A)之間的間隙之和(我們可以稱之為total_needed)是奇數,那么這個任務就不可能完成。同樣,我們也可以在不改變答案的情況下對該問題進行如下轉換:

    新問題:設M=max(A)。讓B成為A[i]-> M-A[i]轉換后的A。我們現在允許的操作是遞減B的兩個不同的索引,我們的目標是達到零陣列。

    我們的目標是達到零陣列。

    從B和遞減的角度來考慮會更容易。你可能想到的第一個策略是:反復遞減B的兩個最大元素,即貪婪策略。這個策略被證明是最優的,只要存在就能找到一個解決方案。

    Max_B = max(B),讓Sum_B = sum(B)。由于我們知道,如果Sum_B是奇數,則不存在解決方案,因此我們可以假設Sum_B從這里開始是偶數。有兩種可能性:

    1. Max_B > Sum_B - Max_B。在這種情況下,無論我們怎么做,在進行Sum_B - Max_B的遞減后,除了Max_B之外,所有的元素都是零,所以不可能有任何解決方案。
    2. Max_B <= Sum_B - Max_B。在這種情況下,解決方案總是可能的。

    為了證明(2),只需證明兩件事。 i. 如果Max_B <= Sum_B - Max_B,那么在遞減了兩個最大的元素后,我們的新陣列仍然有Max_B <= Sum_B - Max_B。 ii. 唯一的配置是,當B的一個元素正好為非零時,沒有任何移動是可能的,在這種情況下,Max_B > Sum_B - Max_B

    第一個宣告的證明是代數操作和案例分析,這相當不令人驚訝,所以我將從這個已經很長的證明中省略。第一個Python代碼片段現在可以理解為檢查total_need的奇偶性,以及我們是否處于上述情況(1)或(2)。

    編輯:最初發布的代碼版本在最后一行有一個錯誤,與解釋和證明中的方程式相比,使用了一個錯誤的變數名和一個翻轉的不等號。歸功于用戶Breaking Not So Bad發現了這個問題,并表示感謝。

    uj5u.com熱心網友回復:

    這里有一個簡單的演算法,它應該是有效的。我們的想法是先增加最低的值:

  • 找到最大值。讓我們稱它為最大值。

  • 找到最大值。

  • 找到最大值。
  • 找到最小值。讓我們稱它為min。如果 min = max,輸出 YES。

  • 找到一個具有min值的元素,并將其遞增。

  • 找到其他元素的最小值。讓我們稱它為min。如果min = max,輸出NO。

  • 找到一個具有min值的元素(除前一個元素外)并將其遞增。

  • 進入第2步。

    轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326061.html

    標籤:

    上一篇:如何在我們的控制器中不使用擴展的情況下使用另一個控制器功能

    下一篇:試圖做一個foreachif的回圈,檢查證書是否即將過期

  • 標籤雲
    其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

    熱門瀏覽
    • Git本地庫既關聯GitHub又關聯Gitee

      創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

      uj5u.com 2020-09-10 05:04:14 more
    • CODING DevOps 代碼質量實戰系列第二課,相約周三

      隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

      uj5u.com 2020-09-10 05:07:43 more
    • 推薦Scrum書籍

      推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

      uj5u.com 2020-09-10 05:07:45 more
    • CODING DevOps 代碼質量實戰系列最后一課,周四發車

      隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

      uj5u.com 2020-09-10 05:07:52 more
    • 敏捷軟體工程實踐書籍

      Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

      uj5u.com 2020-09-10 05:07:55 more
    • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

      前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

      uj5u.com 2020-09-10 05:08:49 more
    • CODING DevOps 微服務專案實戰系列第一課,明天等你

      CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

      uj5u.com 2020-09-10 05:09:14 more
    • CODING DevOps 微服務專案實戰系列第二課來啦!

      近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

      uj5u.com 2020-09-10 05:09:33 more
    • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

      隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

      uj5u.com 2020-09-10 05:10:00 more
    • CODING 儀表盤功能正式推出,實作作業資料可視化!

      CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

      uj5u.com 2020-09-10 05:11:01 more
    最新发布
    • windows系統git使用ssh方式和gitee/github進行同步

      使用git來clone專案有兩種方式:HTTPS和SSH:
      HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
      SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

      uj5u.com 2023-04-19 08:41:12 more
    • windows系統git使用ssh方式和gitee/github進行同步

      使用git來clone專案有兩種方式:HTTPS和SSH:
      HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
      SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

      uj5u.com 2023-04-19 08:35:34 more
    • 2023年農牧行業6大CRM系統、5大場景盤點

      在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

      uj5u.com 2023-04-18 08:05:44 more
    • 2023年農牧行業6大CRM系統、5大場景盤點

      在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

      uj5u.com 2023-04-18 08:00:18 more
    • 計算機組成原理—存盤器

      計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

      uj5u.com 2023-04-17 08:20:31 more
    • 談一談我對協同開發的一些認識

      如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

      uj5u.com 2023-04-17 08:18:55 more
    • 專案管理PRINCE2核心知識點整理

      PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
      PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

      uj5u.com 2023-04-17 08:18:51 more
    • 談一談我對協同開發的一些認識

      如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

      uj5u.com 2023-04-17 08:18:00 more
    • 專案管理PRINCE2核心知識點整理

      PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
      PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

      uj5u.com 2023-04-17 08:17:55 more
    • 計算機組成原理—存盤器

      計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

      uj5u.com 2023-04-17 08:12:06 more