leetcode Day11 贪心

80 阅读1分钟

824. 山羊拉丁文

var toGoatLatin = function(sentence) {
    //建立res数组,遍历每个单词,依此把修改完的字符串放到数组中,返回
    let res=[]
    let letters=['a','e','i','o','u']
    let s=sentence.split(' ')
    for(let i=0;i<s.length;i++){
        if(letters.indexOf(s[i][0].toLowerCase())!==-1){
            res.push(s[i]+'ma'+'a'.repeat(i+1))
        }
        else{
            res.push(s[i].slice(1,s[i].length)+s[i][0]+'ma'+'a'.repeat(i+1))
        }
    }
    return res.join(' ')
};

贪心:由每一阶段的局部最优,推出整体最优

解题步骤:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

455. 分发饼干

var findContentChildren = function(g, s) {
    //先排序,满足s,g中递增,然后双指针,优先满足胃口大的孩子
    let res=0
    let m=s.length-1
    s.sort((a,b)=>a-b)
    g.sort((a,b)=>a-b)
    for(let i=g.length-1;i>=0;i--){
        if(s[m]>=g[i]){
            res++
            m--
        }
    }
    return res
};

53. 最大子数组和

var maxSubArray = function(nums) {
    //遍历,大于res则更新,小于0则重新计数
    let res=-Infinity
    let sum=0
    for(let i=0;i<nums.length;i++){
        sum=sum+nums[i]
        if(sum>res){
            res=sum
        }
        if(sum<0){
            sum=0
        }
    }
    return res
};

122. 买卖股票的最佳时机 II

var maxProfit = function(prices) {
    //在同一天,既可以卖出,也可以买入,只要递增,就能获得这天的收益
    let res=0
    for(let i=1;i<prices.length;i++){
        if(prices[i]>prices[i-1]){
            res+=prices[i]-prices[i-1]
        }
    }
    return res
};

55. 跳跃游戏

var canJump = function(nums) {
    //每到一个位置,存储最大可达位置
    if(nums.length===1)return true
    let s=nums[0]
    for(let i=1;i<nums.length;i++){
        if(i<=s){
            //说明i可达
            s=s<i+nums[i]?i+nums[i]:s
        }
        if(s>=nums.length-1){
            return true
        }
    }
    return false
};

45. 跳跃游戏 II

var jump = function(nums) {
    //到达最远能到的边界后才需要跳
    let max=0,end=0,step=0
    for(let i=0;i<nums.length-1;i++){
        max=Math.max(max,i+nums[i])
        if(i===end){
            step++
            end=max
        }
    }
    return step
};