贪心算法
动物界的贪心算法
贪心算法-原理拆解
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; } }