超級醜數--用堆查找解決

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/27/12236809.html
-Advertisement-
Play Games

利用堆排序很容易進行查找 質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。 質因數(素因數或質因數)在數論里是指能整除給定正整數的質數。除了1以外,兩個沒有其他共同質因數的正整數稱為互質。因為1沒有質因數,1與任何正整數(包括1本身)都是互質 把只 ...


利用堆排序很容易進行查找


質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。
質因數(素因數或質因數)在數論里是指能整除給定正整數的質數。除了1以外,兩個沒有其他共同質因數的正整數稱為互質。因為1沒有質因數,1與任何正整數(包括1本身)都是互質
把只包含質因數2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但7.14不是,因為它們包含質因數7。 習慣上我們把1當做是第一個醜數

class Ugly {
  constructor (n, primes) {
    this.n = n
    this.primes = new Heap(primes)
  }
  getAll () {
    // 超級醜數列表
    let res = [1]
    let i = 2
    let primes = this.primes
    // 不知道上限用while迴圈
    while (res.length < this.n) {
      let arr = Ugly.getPrimies(i)
      let k = 0
      let l = arr.length
      for (; k < l; k++) {
        if (!primes.find(arr[k])) {
          break
        }
      }
      // k===l有兩種情況,1.壓根沒有質因數,2.質因數都在指定列表中
      if (k === l) {
        if (l === 0) {
          if (primes.find(i)) {
            res.push(i)
          }
        } else {
          res.push(i)
        }
      }
      i++
    }
    // 返回醜數數組
    return res[this.n - 1]
  }
  // 計算指定正整數n的質因數
  static getPrimies (n) {
    let prime = (n) => {
      let arr = []
      for (let i = 2; i < n / 2 + 1; i++) {
        // 求質數利用遞歸,因為返回的是一個arr數組,當數組為空時說明是質數
        if (n % i === 0 && !prime(i).length) {
          arr.push(i)
        }
      }
      return arr
    }
    return prime(n)
  }
}

class Heap {
  constructor (arr) {
    this.data = arr
    this.max = arr.length
    this.sort()
  }
  sort () {
    let iArr = this.data
    let n = iArr.length
    if (n <= 1) {
      return iArr
    } else {
      // 迴圈是為了遍歷每一個可能要調整的節點,maxHeapify內部遞歸是為了回覆被破壞的堆
      for (let i = Math.floor(n / 2); i >= 0; i--) {
        Heap.maxHeapify(iArr, i, n)
      }
      return iArr
    }
  }
  find (val, i = 0) {
    let arr = this.data
    if (val > arr[i] || i > this.max) {
      return false
    } else if (val === arr[i]) {
      return val
    } else {
      return this.find(val, i * 2 + 1) || this.find(val, i * 2 + 2)
    }
  }
  static swap (arr, a, b) {
    if (a === b) {
      return ''
    }
    // 交換
    let c = arr[a]
    arr[a] = arr[b]
    arr[b] = c
  }
  // 構建最大堆
  static maxHeapify (Arr, i, size) {
    // 左節點
    let l = i * 2 + 1
    // 右節點
    let r = i * 2 + 2
    let largest = i
    // 父節點和左節點l作比較獲取最大
    if (l <= size && Arr[l] > Arr[largest]) {
      largest = l
    }
    // 右節點額最大值比較
    if (r <= size && Arr[r] > Arr[largest]) {
      largest = r
    }
    if (largest !== i) {
      Heap.swap(Arr, i, largest)
      Heap.maxHeapify(Arr, largest, size)
    }
  }
}

export default Ugly
export {
  Heap
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要介紹了win2012 掛載硬碟即增加新硬碟方法,需要的朋友可以參考下 點擊左下角的伺服器管理圖標 點擊右上角的“工具”,再選擇“電腦管理” 再點擊“磁碟管理” 在磁碟1的按鈕處單擊右鍵,選擇“聯機” 聯機之後再在磁碟1的按鈕處單擊右鍵,選擇“初始化磁碟” 點擊“確定” 在未分配的空間處 ...
  • 更改適配器屬性 -> 選擇一個網路,單擊右鍵 -> 屬性 -> Internet 協議版本 4 (TCP/IPv4)-> 屬性 進入如下界面,開始配置: IP地址: IP地址用於網路通信,根據我的地址找到我 <=> 根據機器的IP地址找到這台機器在網路中的位置,確定了位置就可以向這台機器發信息交互了 ...
  • BitLocker恢復時反覆提示輸入密鑰和密鑰正確問題的解決方案。 ...
  • docker search nextcloud docker pull docker.io/nextcloud docker images mkdir /home/nextcloud chmod -R 777 nextcloud/ docker run -d --restart=always --n ...
  • 主從複製是msql資料庫的高可用 讀寫分離 容災備份 等的基本要求 在這主從複製之前我們需要準備以下條件 保證master資料庫和從資料庫的mysql版本一致 matser和從數據防火牆關閉 資料庫埠開啟 好了,開搞 奧利給 兄弟們 乾就完了 首先我們要配置主資料庫的信息 以樓主win系統下的數據 ...
  • 製造行業的IT應用ERP/CRMOA/郵件系統製造業數據管理需求彙總數據分層管理資料庫實時複製終端數據管理集中備份備份到雲連續數據複製到雲在雲中恢復雲中備份、多數據中心今天先到這兒,希望對技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能感... ...
  • 資料庫伺服器通常包含關鍵的數據,確保這些數據的安全和完整需要利用訪問控制。一、訪問控制MySQL伺服器的安全基礎:用戶應該對他們需要的數據具有適當的訪問權,既不能多也不能少。訪問控制:你需要給用戶提供他們所需的訪問權,且僅提供他們所需的訪問權。在日常工作中,絕不能使用root,應該創建一系列的賬號, ...
  • redis中字典相關的文件為:dict.h與dict.c 與其說是一個字典,道不如說是一個哈希表。 一、數據結構 dictEntry 1 typedef struct dictEntry { 2 void *key; 3 union { 4 void *val; 5 uint64_t u64; 6 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...