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

將數組和減半的最少操作次數(力扣)

這篇具有很好參考價值的文章主要介紹了將數組和減半的最少操作次數(力扣)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題目描述

給你一個正整數數組 nums 。每一次操作中,你可以從 nums 中選擇 任意 一個數并將它減小到 恰好 一半。(注意,在后續(xù)操作中你可以對減半過的數繼續(xù)執(zhí)行操作)

請你返回將 nums 數組和 至少 減少一半的 最少 操作數。

示例 1:

輸入:nums = [5,19,8,1]
輸出:3
解釋:初始 nums 的和為 5 + 19 + 8 + 1 = 33 。
以下是將數組和減少至少一半的一種方法:
選擇數字 19 并減小為 9.5 。
選擇數字 9.5 并減小為 4.75 。
選擇數字 8 并減小為 4 。
最終數組為 [5, 4.75, 4, 1] ,和為 5 + 4.75 + 4 + 1 = 14.75 。
nums 的和減小了 33 - 14.75 = 18.25 ,減小的部分超過了初始數組和的一半,18.25 >= 33/2 = 16.5 。
我們需要 3 個操作實現題目要求,所以返回 3 。
可以證明,無法通過少于 3 個操作使數組和減少至少一半。

示例 2:

輸入:nums = [3,8,20]
輸出:3
解釋:初始 nums 的和為 3 + 8 + 20 = 31 。
以下是將數組和減少至少一半的一種方法:
選擇數字 20 并減小為 10 。
選擇數字 10 并減小為 5 。
選擇數字 3 并減小為 1.5 。
最終數組為 [1.5, 8, 5] ,和為 1.5 + 8 + 5 = 14.5 。
nums 的和減小了 31 - 14.5 = 16.5 ,減小的部分超過了初始數組和的一半, 16.5 >= 31/2 = 16.5 。
我們需要 3 個操作實現題目要求,所以返回 3 。
可以證明,無法通過少于 3 個操作使數組和減少至少一半。
提示:

1 <= nums.length <= 105
1 <= nums[i] <= 107

思路

每次操作,會將數組中的一個數減半。要求使得數組和,至少減少到一半的操作次數最少是多少,那么每次操作應該選擇當前數組的最大值進行減半。
因此用一個優(yōu)先隊列(大根堆)維護數組中的所有數,每次從優(yōu)先隊列中取出最大值,將其減半,然后將減半后的數重新放入優(yōu)先隊列中,同時更新減半和的值和temp,直到temp大于等于數組和sum的一半為止。返回操作次數即可。

測試代碼


class Solution{
    public int halveArray(int[] nums) {
        PriorityQueue<Double> p=new PriorityQueue(new Comparator<Double>() {
            @Override
            public int compare(Double o1, Double o2) {
                //排序,大的數字排在前面
                return o2-o1>0?1:o2-o1<0?-1:0;
            }
        });

        //往隊列添加nums數組的值,并計算數組的和
        double sum=0;
        for (double i:nums) {
            p.offer(i*1.0);
            sum+=i;
        }

        int count=0;
        double temp=0;
        //如果temp的值小于數組和的一半那么執(zhí)行循環(huán)
        while (sum/2.0>temp){
            //刪除堆頂元素
            double t=(double)p.poll();
            temp+=t/2;
            //添加減少一半的數值
            p.add(t/2);
            count++;
        }
        //返回操作次數
        return count;
    }
}

復雜度

將元素插入堆和刪除堆頂元素的時間復雜度為O(logN),其中N是元素的數量。因此,堆操作的總時間復雜度為O(NlogN)。
堆可能包含所有的數組元素,因此空間復雜度為O(N)。

測試結果

將數組和減半的最少操作次數(力扣),leetcode題目,leetcode,算法,數據結構文章來源地址http://www.zghlxwxcb.cn/news/detail-604251.html

到了這里,關于將數組和減半的最少操作次數(力扣)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【LeetCode】1654:到家的最少跳躍次數的解題思路 & 關于力扣無法return的BUG的討論

    【LeetCode】1654:到家的最少跳躍次數的解題思路 & 關于力扣無法return的BUG的討論

    有一只跳蚤的家在數軸上的位置 x 處。請你幫助它從位置 0 出發(fā),到達它的家。 跳蚤跳躍的規(guī)則如下: 它可以 往前 跳恰好 a 個位置(即往右跳)。 它可以 往后 跳恰好 b 個位置(即往左跳)。 它不能 連續(xù) 往后跳 2 次。 它不能跳到任何 forbidden 數組中的位置。 跳蚤可以往

    2024年02月10日
    瀏覽(21)
  • 【算法】力扣【動態(tài)規(guī)劃,LCS】1312. 讓字符串成為回文串的最少插入次數

    1312. 讓字符串成為回文串的最少插入次數 本文探討的是力扣(LeetCode)上的第1312題:讓字符串成為回文串的最少插入次數。這是一道屬于動態(tài)規(guī)劃類別下的困難題目,通常以回文串相關的操作來衡量算法的優(yōu)化和執(zhí)行效率。 問題的核心是給定一個字符串 s ,你可以在任意位

    2024年01月23日
    瀏覽(30)
  • Leetcode3071. 在矩陣上寫出字母 Y 所需的最少操作次數

    Leetcode3071. 在矩陣上寫出字母 Y 所需的最少操作次數

    題目來源:3071. 在矩陣上寫出字母 Y 所需的最少操作次數 統(tǒng)計 Y 中的元素出現次數,記到一個長為 3 的數組 cnt1 中。統(tǒng)計不在 Y 中的元素出現次數,記到一個長為 3 的數組 cnt2 中。 計算最多可以保留多少個元素不變,設這個值為 maxNotChange。 在 0,1,2 中枚舉 i 和 j,其中 i≠

    2024年03月18日
    瀏覽(19)
  • C++二分算法:得到子序列的最少操作次數

    二分查找算法合集 給你一個數組 target ,包含若干 互不相同 的整數,以及另一個整數數組 arr ,arr 可能 包含重復元素。 每一次操作中,你可以在 arr 的任意位置插入任一整數。比方說,如果 arr = [1,4,1,2] ,那么你可以在中間添加 3 得到 [1,4,3,1,2] 。你可以在數組最開始或最后

    2024年02月05日
    瀏覽(18)
  • 【算法|動態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數

    【算法|動態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學習過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進步。

    2024年02月06日
    瀏覽(23)
  • 【LeetCode - 每日一題】1654. 到家的最少跳躍次數(23.08.30)

    可以左跳可以右跳 不能連續(xù)左跳兩次 不能跳到負數 不能跳到 forbidden[] 求可以跳到 x 的最少跳躍次數 a. overview 最初時,只有 0 位置可以進行跳躍;在跳到 a 位置后,又可以跳到 2a 位置和 a-b 位置(如果 ab );然后又多了兩個位置(或者一個位置)可以跳躍…因此這是一個

    2024年02月10日
    瀏覽(26)
  • 2023-06-17 LeetCode每日一題(分割圓的最少切割次數)

    2023-06-17 LeetCode每日一題(分割圓的最少切割次數)

    點擊跳轉到題目位置 圓內一個 有效切割 ,符合以下二者之一: 該切割是兩個端點在圓上的線段,且該線段經過圓心。 該切割是一端在圓心另一端在圓上的線段。 一些有效和無效的切割如下圖所示。 給你一個整數 n ,請你返回將圓切割成相等的 n 等分的 最少 切割次數。

    2024年02月09日
    瀏覽(25)
  • 【LeetCode每日一題合集】2023.8.28-2023.9.3(到家的最少跳躍次數)

    【LeetCode每日一題合集】2023.8.28-2023.9.3(到家的最少跳躍次數)

    https://leetcode.cn/problems/insert-interval/ 提示: 0 = intervals.length = 10^4 intervals[i].length == 2 0 = intervals[i][0] = intervals[i][1] = 10^5 intervals 根據 intervals[i][0] 按 升序 排列 newInterval.length == 2 0 = newInterval[0] = newInterval[1] = 10^5 當前區(qū)間與要加入的新區(qū)間之間的關系只有兩種可能:相交或者不相

    2024年02月09日
    瀏覽(27)
  • LeetCode面試算法-力扣 88. 合并兩個有序數組

    88. 合并兩個有序數組 題目描述 ? ? 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2,另有兩個整數 m 和 n ,分別表示 nums1 和 nums2 中的元素數目。請你 合并 nums2 到 nums1 中,使合并后的數組同樣按 非遞減順序 排列。 注意: 最終,合并后數組不應由函數返回,而是存儲

    2024年02月10日
    瀏覽(20)
  • 力扣(LeetCode)算法_C++—— 兩個數組的交集

    給定兩個數組 nums1 和 nums2 ,返回 它們的交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。 示例 1: 輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2] 示例 2: 輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4] 解釋:[4,9] 也是可通過的

    2024年02月09日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包