日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法】 - 动态规划 + 位运算

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】 - 动态规划 + 位运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

思路1:

  • 寫一個返回2進制中1數量的函數countOne
  • 遍歷0到num,對每一個數使用countOne,并將結果保存到res中返回
  • var countBits = function (num) {let res = new Array(num + 1).fill(0);for (let i = 0; i <= num; i++) {res[i] = countOne(i.toString(2));}return res; };const countOne = num => {let res = 0;for (let i = 0; i < num.length; i++) {if (num[i] == 1) {res++;}}return res; }

    思路2:

  • 上面求1的個數的速率可以提升,可以考慮采用位運算來求
  • var countBits = function (num) {let res = new Array(num + 1).fill(0);for (let i = 0; i <= num; i++) {res[i] = countOne(i);}return res; };const countOne = num => {let res = 0;while (num > 0) {res++;num = num & (num - 1);}return res; }

    思路3:

    找到后面數與前面數的聯系,利用緩存進一步加速

  • 對于十進制10來說,其對應的二進制為"1010",其1的位數dp[10]為十進制2中1的位數 + 1,其對應公式如下:
  • dp[10] = dp[2] + 1;

  • 10與2之間其實只差一個十進制8(“1000”)
  • 同理十進制13(“1101”)其1的個數可以由公式 dp[13] = dp[5] + 1 求出
  • 十進制5的二進制對應"101"

  • 因此可以得到遞推關系式, dp[i] = dp[i - highBit] + 1;
  • 其中 highBit是不超過i的2的最大整數次冪
    算法如下:

    var countBits = function (num) {let dp = new Array(num + 1).fill(0);let highBit = 0;for (let i = 1; i <= num; i++) {if ((i & (i - 1)) == 0) {highBit = i;}dp[i] = dp[i - highBit] + 1;}return dp; };

    總結

    以上是生活随笔為你收集整理的【算法】 - 动态规划 + 位运算的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。