国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Leetcode 第 380 場周賽 Problem C 價值和小于等于 K 的最大數(shù)字(Java + 二分答案 + 規(guī)律)

這篇具有很好參考價值的文章主要介紹了Leetcode 第 380 場周賽 Problem C 價值和小于等于 K 的最大數(shù)字(Java + 二分答案 + 規(guī)律)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

題目

  • Problem: 100160. 價值和小于等于 K 的最大數(shù)字
  • 給你一個整數(shù) k 和一個整數(shù) x 。
  • 令 s 為整數(shù) num 的下標(biāo)從 1 開始的二進(jìn)制表示。我們說一個整數(shù) num 的 價值 是滿足 i % x == 0 且 s[i] 是 設(shè)置位 的 i 的數(shù)目。
  • 請你返回 最大 整數(shù) num ,滿足從 1 到 num 的所有整數(shù)的 價值 和小于等于 k 。
  • 注意:
    • 一個整數(shù)二進(jìn)制表示下 設(shè)置位 是值為 1 的數(shù)位。
    • 一個整數(shù)的二進(jìn)制表示下標(biāo)從右到左編號,比方說如果 s == 11100 ,那么 s[4] == 1 且 s[2] == 0 。
    • 1 <= k <= 10 ^ 15
    • 1 <= x <= 8

思路

Java + 二分答案 + 規(guī)律

第 1 步:

  • 首先 [1, maxNum] 在確定 x 后顯然滿足"價值和"單調(diào)非遞減,因此可以二分最大值 maxNum
  • 其次需要確定 [1, maxNum] 在確定 x 的"價值和"就行

第 2 步:

  • 二分答案確定上下界:
    • k 最小為 1,x 最小為 1 代表每一位均統(tǒng)計,此時結(jié)果最小、即下界為 1
    • k 最大為 1e15,x 最大為 8 代表每 8 位統(tǒng)計一次、即每 2^8 個數(shù)最少會記錄 1 次,此時結(jié)果最大,而開始的 [1, 2^8-1] 在 x=8 時不統(tǒng)計,因此上界就是 (k+1)*2^8-1

第 3 步:

  • [1, maxNum] 在 x 下的"價值和"可以找規(guī)律,我們先寫出 [1, 8] 的二進(jìn)制:
  • 0001
  • 0010
  • 0011
  • 0100
  • 0101
  • 0110
  • 0111
  • 1000
  • 按題意最后一位往前看(可以多寫幾位來看):
    • 第 1 位是先零位 0 然后"一位 1 一位 0"的 10 依次循環(huán)
    • 第 2 位是先一位 0 然后"兩位 1 兩位 0"的 10 依次循環(huán)
    • 第 3 位是先三位 0 然后"四位 1 四位 0"的 10 依次循環(huán)
    • 第 4 位是先七位 0 然后"八位 1 八位 0"的 10 依次循環(huán)
  • 如果我們前面加上 0,可以得到第 i 位是 “2^(i-1) 位 0 與 2^(i-1) 位 1” 的 01 依次循環(huán)

第 4 步:

  • 對于 [1, maxNum] 先轉(zhuǎn)化為 [0, maxNum] 總共 maxNum+1 個數(shù),
  • 然后循環(huán) long 總共的 63 位 i,當(dāng)滿足 (i % x == 0) 時,記錄第 i 位"價值和",
  • 分為前面循環(huán)的 1 + 可能有的最后一個不完整的循環(huán) 1
  • 前面循環(huán)的 1,先除循環(huán)再乘完整的 1:(maxNum + 1) / 2^i * 2^(i-1)
  • 可能有的最后一個不完整的循環(huán) 1,先減去完整循環(huán)再減去開頭的 0:max((maxNum + 1) % 2^i - 2^(i-1), 0)

復(fù)雜度

時間復(fù)雜度:

時間復(fù)雜度: O ( 63 ? l o g ( k < < x ) ) O(63*log(k<<x)) O(63?log(k<<x))

空間復(fù)雜度:

空間復(fù)雜度: O ( n ) O(n) O(n)文章來源地址http://www.zghlxwxcb.cn/news/detail-805692.html

Code

class Solution {
    /**
     * Java + 二分答案 + 規(guī)律:
     *
     * 第 1 步:
     * 首先 [1, maxNum] 在確定 x 后顯然滿足"價值和"單調(diào)非遞減,因此可以二分最大值 maxNum,
     * 其次需要確定 [1, maxNum] 在確定 x 的"價值和"就行
     *
     * 第 2 步:
     * 二分答案確定上下界:
     *     * k 最小為 1,x 最小為 1 代表每一位均統(tǒng)計,此時結(jié)果最小、即下界為 1
     *     * k 最大為 1e15,x 最大為 8 代表每 8 位統(tǒng)計一次、即每 2^8 個數(shù)最少會記錄 1 次,此時結(jié)果最大,而開始的 [1, 2^8-1] 在 x=8 時不統(tǒng)計,因此上界就是 (k+1)*2^8-1
     *
     * 第 3 步:
     * [1, maxNum] 在 x 下的"價值和"可以找規(guī)律,我們先寫出 [1, 8] 的二進(jìn)制:
     * 0001
     * 0010
     * 0011
     * 0100
     * 0101
     * 0110
     * 0111
     * 1000
     * 按題意最后一位往前看(可以多寫幾位來看):
     *     * 第 1 位是先零位 0 然后"一位 1 一位 0"的 10 依次循環(huán)
     *     * 第 2 位是先一位 0 然后"兩位 1 兩位 0"的 10 依次循環(huán)
     *     * 第 3 位是先三位 0 然后"四位 1 四位 0"的 10 依次循環(huán)
     *     * 第 4 位是先七位 0 然后"八位 1 八位 0"的 10 依次循環(huán)
     * 如果我們前面加上 0,可以得到第 i 位是 "2^(i-1) 位 0 與 2^(i-1) 位 1" 的 01 依次循環(huán),
     *
     * 第 4 步:
     * 對于 [1, maxNum] 先轉(zhuǎn)化為 [0, maxNum] 總共 maxNum+1 個數(shù),
     * 然后循環(huán) long 總共的 63 位 i,當(dāng)滿足 (i % x == 0) 時,記錄第 i 位"價值和",
     * 分為前面循環(huán)的 1 + 可能有的最后一個不完整的循環(huán) 1
     * 前面循環(huán)的 1,先除循環(huán)再乘完整的 1:(maxNum + 1) / 2^i * 2^(i-1)
     * 可能有的最后一個不完整的循環(huán) 1,先減去完整循環(huán)再減去開頭的 0:max((maxNum + 1) % 2^i - 2^(i-1), 0)
     * 時間復(fù)雜度:O(63*log(k<<x)),空間復(fù)雜度:O(1)
     *
     */
    public long findMaximumNumber(long k, int x) {
        // 二分答案,確定上下界
        long left = 1;
        long right = (k + 1) << x - 1;

        long res = 1;
        while (left <= right) {
            // 避免加法溢出
            long mid = ((right - left) >> 1) + left;
            // 獲取 [1, mid] 在 x 下的"價值和"
            long count = getCount(mid, x);
            if (count <= k) {
                res = mid;
                left = mid + 1;

            } else {
                right = mid - 1;
            }
        }

        return res;
    }

    /**
     * 獲取 [1, maxNum] 在 x 下的"價值和"
     */
    private long getCount(long maxNum, int x) {
        long res = 0;
        // long 的最大值有 63 位
        for (int i = 1; i <= 63; i++) {
            if (i % x == 0) {
                // 獲取每個循環(huán)之和
                res += (maxNum + 1) / (1L << i) * (1L << i - 1);
                // 獲取可能有的最后一個不完整的循環(huán)
                res += Math.max((maxNum + 1) % (1L << i) - (1L << i - 1), 0);
            }
        }

        return res;
    }
}

到了這里,關(guān)于Leetcode 第 380 場周賽 Problem C 價值和小于等于 K 的最大數(shù)字(Java + 二分答案 + 規(guī)律)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【LeetCode周賽】LeetCode第370場周賽

    【LeetCode周賽】LeetCode第370場周賽

    一場比賽中共有 n 支隊伍,按從 0 到 n - 1 編號。 給你一個下標(biāo)從 0 開始、大小為 n * n 的二維布爾矩陣 grid 。對于滿足 0 = i, j = n - 1 且 i != j 的所有 i, j :如果 grid[i][j] == 1,那么 i 隊比 j 隊 強(qiáng) ;否則,j 隊比 i 隊 強(qiáng) 。 在這場比賽中,如果不存在某支強(qiáng)于 a 隊的隊伍,則認(rèn)為

    2024年02月05日
    瀏覽(18)
  • [LeetCode周賽復(fù)盤] 第 359 場周賽20230820

    [LeetCode周賽復(fù)盤] 第 359 場周賽20230820

    T1 模擬。 T2 數(shù)學(xué)貪心。 T3 dp。 T4 分組+滑窗。 2828. 判別首字母縮略詞 1. 題目描述 2. 思路分析 按題意模擬即可。 3. 代碼實現(xiàn) 2829. k-avoiding 數(shù)組的最小總和 1. 題目描述 2. 思路分析 貪心 1~k-1中,選了1就不能選k-1;選了2就不能選k-2… 因此可以選1~k//2 剩余的從k開始向上選。 可以

    2024年02月11日
    瀏覽(53)
  • [LeetCode周賽復(fù)盤] 第 348場周賽20230604

    [LeetCode周賽復(fù)盤] 第 348場周賽20230604

    這場可惜了。 T1 模擬。 T2 模擬。 T3 倒序計算。 T4 同時限制上下界的數(shù)位DP。 6462. 最小化字符串長度 1. 題目描述 2. 思路分析 題意仔細(xì)想一下就會發(fā)現(xiàn),其實會將每個字符僅留1個。 3. 代碼實現(xiàn) 6424. 半有序排列 1. 題目描述 2. 思路分析 由于只能相鄰交換來移動,因此每次只能

    2024年02月08日
    瀏覽(52)
  • [LeetCode周賽復(fù)盤] 第 353 場周賽20230709

    [LeetCode周賽復(fù)盤] 第 353 場周賽20230709

    感覺有獎品大家都來了。 T1 數(shù)學(xué)。 T2 dp。 T3 dp。 T4 差分/BIT RUPQ。 6451. 找出最大的可達(dá)成數(shù)字 1. 題目描述 2. 思路分析 為了使x num在t步內(nèi)相同,需要相向而行,每步最大縮短距離是2,那么t步距離是2t。 3. 代碼實現(xiàn) 6899. 達(dá)到末尾下標(biāo)所需的最大跳躍次數(shù) 1. 題目描述 2. 思路分

    2024年02月15日
    瀏覽(16)
  • leetcode 第360場周賽

    好久沒參加leetcode周賽了,比賽時間都從兩小時變成了一個半小時。這次周賽由兩道簽到題和兩道中等難度題組成,嚴(yán)格來說最后一道的難度也可以視為hard,但是只要想到正確的思路,編碼還是比較容易的。 比賽鏈接:leetcode 第 360 場周賽 題目描述 給你一個長度為 n 的字符串

    2024年02月11日
    瀏覽(25)
  • LeetCode第354場周賽

    給你一個下標(biāo)從 1 開始、長度為 n 的整數(shù)數(shù)組 nums 。 對 nums 中的元素 nums[i] 而言,如果 n 能夠被 i 整除,即 n % i == 0 ,則認(rèn)為 num[i] 是一個 特殊元素 。 返回 nums 中所有 特殊元素 的 平方和 。 直接模擬就好了 給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 nums 和一個 非負(fù) 整數(shù) k 。 在一

    2024年02月16日
    瀏覽(28)
  • LeetCode第343場周賽

    2023.4.30LeetCode第343場周賽 根據(jù)題意模擬 使用哈希表記錄每個數(shù)出現(xiàn)的位置,再用m+n個集合記錄每一行和每一列被涂滿的格子數(shù),若某行或某列全部被涂滿則返回答案 BFS 首先將距離大于兩點(diǎn)的曼哈頓距離的特殊路徑去掉 每個點(diǎn)考慮經(jīng)過每個特殊路徑到達(dá),分成兩段,一段是當(dāng)

    2024年02月02日
    瀏覽(22)
  • LeetCode第347場周賽

    2023.5.28LeetCode第347場周賽 從最后一位開始遍歷,為0則跳過 暴力模擬 對于每個 s[i] != s[i - 1] ,要使其相等 有兩種選擇,翻轉(zhuǎn)前 i 個,或者翻轉(zhuǎn)后 n - i 個,選擇代價最小的方案 動態(tài)規(guī)劃 從小到大枚舉所有值,每個值一定是從更小的數(shù)轉(zhuǎn)移而來 定義動態(tài)規(guī)劃數(shù)組f, f[i][j] 表示

    2024年02月06日
    瀏覽(18)
  • leetcode第 357/358 場周賽

    可能別人有更好的解法,我這寫法是不斷往線段樹中插入數(shù)值,每次先插入nums[i-x],然后搜索(1到i)中的最大值和(i到max)中的最小值去更新ans。 看了看別人題解,直接用set寫是真的牛。自己還是見識短淺了。 暴力亂搞,考慮兩種極端情況,一種無腦選profit大的,一種優(yōu)先選

    2024年02月12日
    瀏覽(18)
  • leetcode第354場周賽補(bǔ)題

    6889. 特殊元素平方和 - 力扣(LeetCode) 思路:模擬 6929. 數(shù)組的最大美麗值 - 力扣(LeetCode) 思路:排序+雙指針 6927. 合法分割的最小下標(biāo) - 力扣(LeetCode) 思路:哈希+枚舉 6924. 最長合法子字符串的長度 - 力扣(LeetCode) 思路:哈希+雙指針

    2024年02月16日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包