leetcode330. 按要求補齊數組 頂級難度玄學貪心

給定一個已排序的正整數數組 nums,和一個正整數?n 。從?[1, n]?區間內選取任意個數字補充到?nums?中,使得?[1, n]?區間內的任何數字都可以用?nums?中某幾個數字的和來表示。請輸出滿足上述要求的最少需要補充的數字個數。

示例?1:

輸入: nums = [1,3], n = 6
輸出: 1?
解釋:
根據 nums?里現有的組合?[1], [3], [1,3],可以得出?1, 3, 4。
現在如果我們將?2?添加到?nums 中,?組合變為: [1], [2], [3], [1,3], [2,3], [1,2,3]。
其和可以表示數字?1, 2, 3, 4, 5, 6,能夠覆蓋?[1, 6]?區間里所有的數。
所以我們最少需要添加一個數字。
示例 2:

輸入: nums = [1,5,10], n = 20
輸出: 2
解釋: 我們需要添加?[2, 4]。
示例?3:

輸入: nums = [1,2,2], n = 5
輸出: 0

思路:這題算是挺著名的貪心題了,想出辦法來很難知道對不對,不會證明,只能先試試能不能過。

設miss是當前能組成1-------miss間的數字。

1)對于遇到的新數字nums[i],如果它小于miss,那么我們可以組成1-----miss+nums[i]之間的所有數(這沒什么可想的)

2)對于遇到的新數字nums[i],如果它大于miss,這時我們能做的最優解應該是添加一個miss數字本身,

使我們的范圍變為1------2*miss。

對于第二點的策略,其實不難猜出來,因為對于多重背包問題(每種物品數量不確定),我們就可以用二進制拆分物品來優化,因為15=1+2+4+8=1111,這四個二進制位就可以表示1----15所有的數字

public class Solution {public int minPatches(int[] nums, int n) {int patches = 0, i = 0;long miss = 1;while (miss <= n) {if (i < nums.length && nums[i] <= miss){miss += nums[i];i++;}else {miss += miss;patches++;}}return patches;}
}

我做這道題時就想起了之前做背包時拆分的二進制,雖然那不是最優解(最優解是單調隊列配合的背包),但是對于這道題是很有幫助的。

具體介紹可以看我之前的文章:

動態規劃入門到熟悉,看不懂來打我啊

?

證明策略正確:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444454.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C:02---scanf、printf

一、printf 控制符 ①精度控制:輸入小數點后m位(%.mf)。右對齊5位,保留小數點后m位(%d.mf)%f、%lf默認輸出6位小數②寬度:%md(打印m為,右對齊,多出m位照常打印)。%-md(打印m位,左對齊,多出m位照常打印)③長度:h表示短(打印短整型short:%hd),l表示長(打印長…

C++:20---成員變量初始化方式

成員變量初始化有三種方式: 在構造函數體內賦值初始化在自定義的公有函數體中賦值初始化(一般用于成員變量的初始化)在構造函數的成員初始化列表初始化一、構造函數體內初始化 說明:在構造函數體內的初始化方式,本質是是為成員變量賦值,而不是真正意義上的初始化,這點要…

leetcode339. 嵌套列表權重和

給定一個嵌套的整數列表&#xff0c;請返回該列表按深度加權后所有整數的總和。 每個元素要么是整數&#xff0c;要么是列表。同時&#xff0c;列表中元素同樣也可以是整數或者是另一個列表。 示例 1: 輸入: [[1,1],2,[1,1]] 輸出: 10 解釋: 因為列表中有四個深度為 2 的 1…

C++:19---this指針

一、this指針介紹 概念:this指針是成員函數的一個隱式參數,在類中本質上就是對象的指針(常量指針)特點:在成員函數中可通過this指針區別成員變量與形參變量this可以顯式調用示例代碼:class Cperson{private:int age;float height;public:void InitPerson(int age,float hei…

leetcode346. 數據流中的移動平均值

給定一個整數數據流和一個窗口大小&#xff0c;根據該滑動窗口的大小&#xff0c;計算其所有整數的移動平均值。 示例: MovingAverage m new MovingAverage(3); m.next(1) 1 m.next(10) (1 10) / 2 m.next(3) (1 10 3) / 3 m.next(5) (10 3 5) / 3 思路&#xff1…

(二十)TCPIP面試寶典-進入大廠必備總結(中)

TCP 作為傳輸層的協議,是一個IT工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。 實際上這篇文章相當于是復習之前的網絡基礎部分。只不過這篇文章的提問方式更靈活,也是讓讀者們懂得變通,更熟悉TCP。 前兩篇文…

leetcode263. 丑數

編寫一個程序判斷給定的數是否為丑數。 丑數就是只包含質因數 2, 3, 5 的正整數。 示例 1: 輸入: 6 輸出: true 解釋: 6 2 3 示例 2: 輸入: 8 輸出: true 解釋: 8 2 2 2 示例 3: 輸入: 14 輸出: false 解釋: 14 不是丑數&#xff0c;因為它包含了另外一個質因數 7。…

(二十一)TCPIP面試寶典-進入大廠必備總結(下)

TCP 作為傳輸層的協議,是一個IT工程師素養的體現,也是面試中經常被問到的知識點。在此,我將 TCP 核心的一些問題梳理了一下,希望能幫到各位。 實際上這篇文章相當于是復習之前的網絡基礎部分。只不過這篇文章的提問方式更靈活,也是讓讀者們懂得變通,更熟悉TCP。 上一篇文…

C++:23 再議const的用法(下)

上一篇文章折騰了一波粉絲,那么這一篇文章稍微溫柔一些。 我主要開始說如何正確使用const 1.不能將const 修飾的任何對象、引用和指針作為賦值表達式的左值。 const int cx=100; const int & rcx=cx; const int * pcx=&cx; cx=200; //error rcx=200; //error *pcx=200…

C++:22 再議const的作用(上)

我在C++:18篇里說過const的用法,這里我有必要再提升進階下const的理解。 因為你可能只知道他是怎么用的,但是他為什么這樣用,其他用法呢? 首先回顧下const有什么主要的作用? (1)可以定義const常量,具有不可變性。 (2)便于進行類型檢查,使編譯器對處理內容有更多了解…

leetcode57. 插入區間

給出一個無重疊的 &#xff0c;按照區間起始端點排序的區間列表。 在列表中插入一個新的區間&#xff0c;你需要確保列表中的區間仍然有序且不重疊&#xff08;如果有必要的話&#xff0c;可以合并區間&#xff09;。 示例 1: 輸入: intervals [[1,3],[6,9]], newInterval …

C:03---運算符優先級

二話不說先看運算符的優先級表: 一、逗號運算符 格式:整個逗號表達式的值返回的結果是最后一個表達式的值使用起來,最好加上括號來返回最后一個表達式的值。否則逗號表達式的意義將失效(見下面演示案例)(表達式1, 表達式2, 表達式3....); #include <stdio.h> int ma…

C++: 21---引用和指針

一般說到誰和誰怎么樣,要么說兩者的相似點,要么兩者的區別,這里我們也要說二者的區別和聯系,同時,也不僅僅是區別和聯系這么簡單,因為你可能會發現在變量賦值,函數傳參這兩點還是有很多值得品一品的。 最直觀的賦值方面的區別 首先我們先說二者的區別和聯系。 (1)指針…

Oracle數據庫Date類型查詢問題(

淺談Oracle數據庫Date類型查詢問題用過Oracle數據庫的朋友應該知道&#xff0c;Oracle數據庫在以Date類型為查詢條件時存在一個小小的BUG&#xff0c;如&#xff1a;select * from tableName where createDate > to_date(2007-01-01,yyyy-mm-dd) and createDate < to_dat…

(二十二)深入淺出TCPIP之實戰篇—用c++開發一個http服務器

在當前的網絡編程專欄前十幾篇文章里&#xff0c;我已經說明了TCPIP常用的一些原理&#xff0c;那么接下來我將逐步進入到實戰編程階段&#xff1a;本篇文章我將帶大家用C做一個http服務器。既然想實現一個http服務器&#xff0c;首先必須要熟悉的就是http協議知識&#xff0c;…

C++:19---重載與模板、模板特例化

一、重載與模板 函數模板可以被另一個模板或一個普通非模板函數重載如果涉及函數模板,則函數匹配規則會有以下的約束:如果同樣好的函數中只有一個是非模板函數,則選擇此函數如果同樣好的函數中沒有非模板函數,而有多個函數模板,則其中一個模板比其他模板更特例化,則選擇此…

leetcode159. 至多包含兩個不同字符的最長子串

給定一個字符串 s &#xff0c;找出 至多 包含兩個不同字符的最長子串 t 。 示例 1: 輸入: "eceba" 輸出: 3 解釋: t 是 "ece"&#xff0c;長度為3。 示例 2: 輸入: "ccaabbb" 輸出: 5 解釋: t 是 "aabbb"&#xff0c;長度為5。 思…

C++:17---函數指針

一、格式 指針名前*號,并且將*和指針名用括號括起來例如: //指針名為pf,指向一個返回值為bool,參數為兩個const string&的函數 bool (*pf)(const string&, const string&); //這個不是函數指針,而是一個返回值為bool*的pf函數 bool *pf(const string&, co…

leetcode161. 相隔為 1 的編輯距離

給定兩個字符串 s 和 t&#xff0c;判斷他們的編輯距離是否為 1。 注意&#xff1a; 滿足編輯距離等于 1 有三種可能的情形&#xff1a; 往 s 中插入一個字符得到 t 從 s 中刪除一個字符得到 t 在 s 中替換一個字符得到 t 示例 1&#xff1a; 輸入: s "ab", t …

C語言-- 大端小端詳解

一、什么是大端和小端 所謂的大端模式,就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。 所謂的小端模式,就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。 簡單來說:大端——高尾端,小端——低尾端 舉個例子,比如數字 0x12 34 56 78…