代碼隨想錄day35【貪心算法】 檸檬水找零 根據(jù)身高重建隊(duì)列 用最少數(shù)量的箭引爆氣球

檸檬水找零

力扣題目鏈接
自己的思路:

  1. 用map存起來5,10,20的個(gè)數(shù)
  2. 遇到20找零的情況有兩種。未對兩種情況的優(yōu)先級進(jìn)行分析。

改進(jìn):

  1. 直接用變量記錄5,10 的個(gè)數(shù),20 不用記錄,因?yàn)椴粫ǖ簟?/li>
  2. 遇到20找零的情況有兩種。應(yīng)先用掉10,5,以保留最多的5,用于找零10及20.

//自己寫的

var lemonadeChange = function(bills) {
    let map=new Map()

    for(let i in bills){
        if(bills[i] === 5){
            map.set(5,map.get(5)? (map.get(5)+1) : 1)
        }else if(bills[i]===10){
            if(map.get(5)>=1){
                map.set(5,map.get(5)-1)
                map.set(10,map.get(10)? (map.get(10)+1) : 1)
            }else{
                return false
            }
        }else if(bills[i]===20){
            if(map.get(10)>=1 && map.get(5)>=1){
                map.set(10,map.get(10)-1)
                map.set(5,map.get(5)-1)
                map.set(20,map.get(20)? (map.get(20)+1): 1)
            }else if(map.get(5)>=3){
                map.set(5,map.get(5)-3)
                map.set(20,map.get(20)? (map.get(20)+1): 1)
            }else{
                return false
            }
        }
    }
    return true
};

//參考

var lemonadeChange = function(bills) {
    let five=0,ten=0

    for(let i in bills){
        if(bills[i] === 5){
            five++
        }else if(bills[i]===10){
            if(five>=1){
                five--
                ten++
            }else{
                return false
            }
        }else if(bills[i]===20){
            if(ten>=1 && five >=1){
                ten--
                five--
            }else if(five>=3){
                five -= 3
            }else{
                return false
            }
        }
    }
    return true
};

根據(jù)身高重建隊(duì)列

力扣題目鏈接
思路:
先按照身高排序(身高相同k小的在前面!注意),再根據(jù)k 插入身高的排序結(jié)果中。

局部最優(yōu):優(yōu)先按身高高的people的k來插入。插入操作過后的people滿足隊(duì)列屬性

全局最優(yōu):最后都做完插入操作,整個(gè)隊(duì)列滿足題目隊(duì)列屬性

var reconstructQueue = function(people) {
    people.sort((a, b ) => {
        if(b[0] !== a[0]) {
            return b[0] - a[0]
        } else {
            return a[1] - b[1]
        }
        
    })

    let queue=[]
    for(let i in people){
        let pos = people[i][1]
        queue.splice(pos,0,people[i])
    }
    return queue
};

用最少數(shù)量的箭引爆氣球

力扣題目鏈接
自己的分析不足之處:未更新右邊界,用以判斷下一個(gè)氣球是否能覆蓋。

參考思路:
局部最優(yōu):當(dāng)氣球出現(xiàn)重疊,一起射,所用弓箭最少。全局最優(yōu):把所有氣球射爆所用弓箭最少。

var findMinArrowShots = function(points) {
    points.sort((a,b)=>{
            return a[0]-b[0]
    })


    let res=1
    for(let i=0;i<points.length-1;i++){
        if(points[i+1][0]>points[i][1]){
            res++
        }else{
            points[i+1][1]= Math.min(points[i][1],points[i+1][1]) //注意這段代碼。。自己沒寫出來
        }
    }
    return res
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容