14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
贪心算法
贪心算法,基本介绍
是在当前步骤上选择最好的方案,即是一种局部最优的选择,并希望这能导致一个全局最优, 比动态规划(需要将所有选择遍历)更加简单,但有时候不可能导致全局最优。有些贪心算法产生全局最优,如MST,单源最短路径
什么时候想到用贪心算法
利用贪心算法求解的问题往往具有两个重要的特性:贪心选择性质和最优子结构性质。如果满足这两个性质就可以使用贪心算法了。
(1)贪心选择
所谓贪心选择性质是指原问题的整体最优解可以通过一系列局部最优的选择得到。应用同一规则,将原问题变为一个相似的但规模更小的子问题,而后的每一步都是当前最佳的选择。这种选择依赖于已做出的选择,但不依赖于未做出的选择。
(2)最优子结构
贪心算法基本思路
贪心算法的基本思路:
1.根据问题来建立数学模型,一般面试题会定义一个简单模型;
2.把待求解问题划分成若干个子问题,对每个子问题进行求解,得到子问题的局部最优解;
3.把子问题的局部最优解进行合并,得到最后基于局部最优解的一个解,即原问题的答案。
Leetcode.435. 无重叠区间
贪心思路:先根据每个区间的右端点,从小到大排序;首个区间就是所有可以选择的区间中右端点最小的那个区间。因此我们将所有区间按照右端点从小到大进行排序,那么排完序之后的首个区间,就是我们选择的首个区间。当确定了首个区间之后,所有与首个区间不重合的区间就组成了一个规模更小的子问题。由于我们已经在初始时将所有区间按照右端点排好序了,因此对于这个子问题,我们无需再次进行排序,只要找出其中与首个区间不重合并且右端点最小的区间即可。用相同的方法,我们可以依次确定后续的所有区间。
/**
执行用时:47 ms, 在所有 Java 提交中击败了98.18%的用户
内存消耗:97.7 MB, 在所有 Java 提交中击败了70.83%的用户
通过测试用例:58 / 58
**/
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length == 0) {
return 0;
}
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[1] - interval2[1];
}
});
int right=-100000;
int result=0;
for(int i=0;i<intervals.length;i++) {
if(intervals[i][1]==right||(intervals[i][1]!=right&&intervals[i][0]<right))
{
result++;
continue;
}
right=intervals[i][1];
}
return result;
}
}