首頁 > 後端開發 > php教程 > 素數減法運算

素數減法運算

Patricia Arquette
發布: 2024-11-14 21:07:02
原創
244 人瀏覽過

Prime Subtraction Operation

2601。素數減法運算

難度:

主題:陣列、數學、二分查找、貪婪、數論

給你一個0索引長度為n的整數數組nums。

您可以執行以下操作:

  • 選擇一個你之前沒有選擇過的索引 i,然後選擇一個質數 p 嚴格小於 nums[i],然後從 nums[i] 中減去 p。

如果可以使用上述操作使 nums 成為嚴格遞增的數組,則傳回 true,否則傳回 false.

嚴格遞增數組 是一個數組,其每個元素都嚴格大於其前一個元素。

範例1:

  • 輸入: nums = [4,9,6,10]
  • 輸出: true
  • 解釋: 第一個操作:選取 i = 0 和 p = 3,然後將 nums[0] 減去 3,使 nums 變為 [1,9,6,10]。
    • 第二個操作:i = 1,p = 7,nums[1]減7,所以nums等於[1,2,6,10]。
    • 第二次運算後,nums 依照嚴格升序排序,所以答案是 true。

範例2:

  • 輸入: nums = [6,8,11,12]
  • 輸出: true
  • 說明: 最初 nums 是嚴格按照遞增順序排序的,所以我們不需要進行任何操作。

範例 3:

  • 輸入: nums = [5,8,3]
  • 輸出: false
  • 解釋:可以證明,沒有辦法進行操作使nums嚴格按升序排序,所以答案是錯誤的。

約束:

  • 1
  • 1
  • nums.length == n

提示:

  1. 考慮一下我們是否有很多質數需要從 nums[i] 中減去。哪個質數更優化?
  2. 從 nums[i] 中減去的最佳質數是使 nums[i] 盡可能最小且大於 nums[i-1] 的質數。

解:

我們需要分解演算法並使其適應 PHP 語法和功能。解決方案主要包括以下步驟:

  1. 生成素數(埃拉托斯特尼篩法):產生所有素數的列表,最大可能值是 nums (1000)。
  2. 素數減法操作:對於nums中的每個數字,檢查是否可以減去一個素數以使數組嚴格遞增。
  3. 二分查找素數:使用二分查找來找出小於目前數字的最大質數,並且仍保持序列嚴格遞增。

讓我們用 PHP 實作這個解:2601。素數減法運算

<?php
class Solution {

    /**
     * @param Integer[] $nums
     * @return Boolean
     */
    function primeSubOperation($nums) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * Helper function to generate all primes up to n using Sieve of Eratosthenes
     *
     * @param $n
     * @return array
     */
    private function sieveEratosthenes($n) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * Helper function to find the largest prime less than a given limit using binary search
     *
     * @param $primes
     * @param $limit
     * @return mixed|null
     */
    private function findLargestPrimeLessThan($primes, $limit) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }
}

// Example usage:
$solution = new Solution();
echo $solution->primeSubOperation([4, 9, 6, 10]) ? 'true' : 'false';  // Output: true
echo $solution->primeSubOperation([6, 8, 11, 12]) ? 'true' : 'false'; // Output: true
echo $solution->primeSubOperation([5, 8, 3]) ? 'true' : 'false';      // Output: false
?>
登入後複製

解釋:

  1. primeSubOperation:循環遍歷 nums 中的每個元素,並檢查是否可以透過減去適當的素數來使每個元素大於前一個元素。

    • 我們使用 $this->findLargestPrimeLessThan 來找出小於 num - prevNum 的最大質數。
    • 如果存在這樣的質數,我們從目前的 num 中減去它。
    • 如果減去素數後,目前 num 不大於 prevNum,我們回傳 false。
    • 否則,我們將 prevNum 更新為目前 num。
  2. sieveEratosthenes:使用埃拉托斯特尼篩法產生 1000 以內的所有素數,並將它們作為數組傳回。

  3. findLargestPrimeLessThan:使用二分搜尋找出小於給定限制的最大質數,確保我們找到用於減法的最佳質數。

複雜性分析

  • 時間複雜度O(n . √m),其中n是nums和m的長度是nums 中元素的最大值(這裡m = 1000)。
  • 空間複雜度O(m),用於儲存最多1000個素數列表。

該解決方案將根據是否可以透過執行所描述的素數減法操作使 nums 嚴格增加來傳回 true 或 false。

聯絡連結

如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!

如果您想要更多類似的有用內容,請隨時關注我:

  • 領英
  • GitHub

以上是素數減法運算的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板