这里写目录标题
贪心算法核心思想
1.局部最优解得到整体最优解
这个就写个遍历就行了,比较简单。
区间按照结尾进行排序。
贪心算法,永远尽可能多的不断贪心的选取当前最优策略的算法。
贪心的核心在于可以用小的替换大的,不能替换的时候就不可以用贪心算法了。
问的是最多最多有介个孩子可以得到满足
孩子要尽可能多
所以我们应该用糖果去找孩子
看看我这个糖果能满足的最小的孩子是是谁
子序列,本序列中删除一些数据之后剩下已然成立就是子序列。
摇摆序列说穿了就是,先升,后降低,然后再升,再降低
上面题目中,后面该降低了,所以选最大那个数15比较容易降低
在一段递增序列中,根据取舍,递增之后就是下降了,为了有更大下降空降,我们必须要在取舍时候,将递增序列中最大那个值需要的结果
在一段递减序列中同理为了递增我们也要选择最小那个值作为下将的取舍
其实这个题目,数那个折现就行了,每次都找波峰和波谷
然后数折就行了
最后那个折数量 + 1就是我们要的子序列的长度。
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length < 2){
return nums.length;
}
//子序列可以不是连续的,原本序列中删除一些元素之后也叫子序列
//因为中间可以跳过一些点
//用count去统计那些点可以组成子摇摆序列
//
//作为判定上升还是下将依据,上升之后就该下降了
//两个指针去遍历数组,pre ,next
int pre = 0;
int next = 1;
int isUp;//1就是上升,0就是下降
int isNow;//表示这一次是上升还是下降
//看看前面有没有转折
isUp = nums[pre] > nums[next] ? 0 : 1;//记录一下一开始是上升还是下
int count = 1;//计算发生了多少次转折
//两个指针放心往后走就行,发生转折就记录下来
while(next < nums.length){
isNow = nums[pre] > nums[next] ? 0 : 1;//记录一下一开始是上升还是下
//相等时候不用处理
//不相等时候才发生转折
if(isUp != isNow){
//说明发生了转折
count++;//记录一次转折
isUp = isNow;//isUp变化一下
}
pre++;
next++;//无论如何指针都往后走
}
return count + 1;//统计节点数目
}
}
class Solution {
public int wiggleMaxLength(int[] nums) {
int down = 1, up = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1])
up = down + 1;
else if (nums[i] < nums[i - 1])
down = up + 1;
}
return nums.length == 0 ? 0 : Math.max(down, up);
}
}
神级别代码
一个贪心题目
这个跳跃游戏最大的点就是在于,我每次追求的事情是
num[i] + i最大,我当年犯的错误就是仅仅是追求num[i]值,最大
class Solution {
public int jump(int[] nums) {
int end = 0;
int maxPosition = 0;
int steps = 0;<