leetcode刷题-贪心算法(持续更新)
Posted feiwuqianqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题-贪心算法(持续更新)相关的知识,希望对你有一定的参考价值。
本来想写完递归再写这个专栏的,但是老师给了一个贪心的题目,没办法只能开一个板块了
简介
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
与这个局部最优解相对应的全局最优解会在动态规划里面展现出来。
例题
先来一道经典的贪心热热手,跳跃游戏就算是一个比较经典的贪心题
思路
一开始看到这个题目不知不觉开始用动态规划在写了 (°ー°〃)
仔细一看返回值才发现是boolean类型,这样我们只要判断存在0的地方能否被跳跃出去就好了
顺便也说一下动态规划的解法,动态规划这里呢,要有一个条件是一点能跳出去,然后求解需要的最少的步数。
这个题目我们只要从开始的时候直接判断我们所能到达的最后一步的总大小,选择最大的就是最优解。
题解
public static boolean canJump(int[] nums) {
if (nums.length<=1) return true;
if (nums[0]==0) return false;
//进行第一遍循环,找到数组中等于0的数字,这里说明一下为什么长度为num.length-1
//假如有这样一个数组 [3,0,0,0] 那么能否通过呢,答案是可以的,因为从3到最后一个阶梯是,就已经离开数组了
//所以最后一个数字我们可以不用判断
for (int i = 0; i < nums.length-1 ; i++) {
if(nums[i]==0){
//从 0 这个数字开始往前遍历,直到第一个数字都无法跳出该0
for(int j =i-1;j>=0;j--){
//如果有一个格子能跳出该0,说明该0可以被无视,退出循环
if(nums[j]>i-j){
break;
}
//已经到达初始位置 没有数字能跳出0 返回false
if(j==0) return false;
}
}
}
return true;
}
例题
好了,看一下老师的题目
学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。
现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini<endi),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。
思路
一开始拿到题目确实懵了一会,但只要抓住一个思路那么就比较简单
所有区间段中结束时间最小的一定会被选择
我们可以画一个区间,结束时间最短的节目无论他的开始时间是什么时候,将它取出来之后剩下的区间一定是最长的,也就是说是能放置节目最多的,按照这个思路,我们只要一次次将最先结束的节目抽取出来,那么是最多的。
public static int find(int action[][]) {
Arrays.sort(action, (o1, o2) -> o1[1] - o2[1]);
if(action[1].length<=1) return 1;
int count = 1;
int temp = 0;
for(int i =1;i<action.length;i++){
if (action[i][0]>=action[temp][1]){
count++;
temp = i;
}
}
return count;
}
额外内容
可能有些兄弟看到代码有疑惑
Arrays.sort(action, (o1, o2) -> o1[1] - o2[1]);
这里用了lambda表达式重新了快速排序的排序方法,这里的意思是,比较第二列的数字作为排序条件
所以你可以使用
Arrays.sort(action, (o1, o2) -> o1[0] - o2[0]);
来比较第一列
下面是快速排序的比较器源代码
Arrays.sort(a, new Comparator() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0]==o2[0])
return o1[1]-o2[1];
return o1[0]-o2[0];
}
});
以上是关于leetcode刷题-贪心算法(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章