贪心算法

动物界的贪心算法

 

 

贪心算法-原理拆解

1. 根据当前情况,做出一步最佳选择

2. 做出选择后,永不改变、永不反悔!(有些算法比如回溯算法,会反悔)

3. 如此循环,用局部最优解,逐步得到整体最优解

贪心算法-快速入门

快速入门:用最简单的案例,理解最深刻的思想

海盗打劫商船

商船上装满古董

每件古董的重量不同

但每件古董的价值都相同

海盗船有最大载重的限制
问,最多装几间古董,既不翻船又获利最大?

 

 

 


 

贪心算法-初级训练

字节跳动笔试题(一颗星)

一个很长的花坛,一部分地已经种植了花,另一部分却没有。

花不能种植在相邻的地块上否则它们会争夺水源,两者都会死去。

给你一个整数数组表示花坛由若干0和1组成0表示没种植花,1表示种植了花。

给定一个数n能不能种下n朵花?

种花-原理分析

 

 

 

 

 

 

 

 

 

 

 

 


 

贪心算法-终极训练

华为笔试题(两星)

给定一个整数数组,表示在同一行的行星。
每一个元素,其绝对值表示行星的大小正负表示行星的移动方向正表示向右移动,负表示向左移动每一颗行星以相同的速度移动。
碰撞规则 :
1、两个行星碰撞,较小的行星会爆炸。
2、如果大小相同,则两颗都会爆炸。
3、两颗移动方向相同的行星,永远不会发生碰撞

class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < asteroids.length; i++) {
            while (!stack.isEmpty() && stack.peek() > 0 && stack.peek() < -asteroids[i]) {
                stack.pop();
            }
            if (!stack.isEmpty() && stack.peek() > 0 && stack.peek() == -asteroids[i]) {
                stack.pop();
            } else if (stack.isEmpty() || asteroids[i] > 0 || stack.peek() < 0) {
                stack.push(asteroids[i]);
            }
        }
        int[] res = new int[stack.size()];
        int index = 0;
        for (Integer item : stack) {
            res[index++] = item;
        }
        return res;
    }
}

 

posted @ 2022-12-23 13:54  红tea  阅读(23)  评论(0编辑  收藏  举报