ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

贪心算法之区间问题详解

2022-03-19 16:32:18  阅读:173  来源: 互联网

标签:int intervals 算法 详解 区间 最优 贪心


目录

1.贪心算法简介

基本思想

局限性

2.经典例题

区间问题

贪心策略

3.代码


1.贪心算法简介

基本思想

1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

局限性

贪心算法失效的很大一个原因在于它明显的局限性:它几乎只考虑局部最优解。 所谓局部最优,就是只考虑当前的最大利益,既不向前多看一步,也不向后多看一步,导致每次都只用当前阶段的最优解。 因此在绝大多数情况下,贪心算法不能得到整体最优解,但它的解是最优解的一个很好近似。

2.经典例题

区间问题

给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。

输入输出样例


输入是一个数组,数组由多个长度固定为2的数组组成,表示区间的开始和结尾。

输出一个整数,表示需要移除的区间数量。


Input :[1,2],[2,4],[1,3]]


Output :1

在这个样例中,我们可以移除区间[1,3],使得剩余的区间[1,2],[2,4]]互不重叠。

贪心策略

在选择要保留区间时,区间的结尾很重要:选择的区间结尾越小,余留给其它区间的空间
就越大,就越能保留更多的区间。

因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。具体实现方法为:

1.先把区间按照结尾的大小进行增序排序

2.每次选择结尾最小且和前一个选择的区间不重叠的区间。

在样例中,排序后的数组为[1,2],[1,3],[2,4]]。按照我们的贪心策略,首先初始化为区间[1,2];由于[1,3]与[1,2]相交,我们跳过该区间;由于[2,4]与[1,2]不相交,我们将其保留。因此最终保留的区间为[1,2],[2,4]。

3.代码

import java.util.Arrays;
import java.util.Comparator;

public class Solution {
	public static int merge(int[][] intervals) {
		//先按照区间结尾的大小进行升序排序
		Arrays.sort(intervals, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[1] - o2[1];
			}
		});
		int count =1;//区间不重合的个数,默认第一个满足题意,初始化为1
		int cur = intervals[0][1];//排序完成后贪心选择的最小的区间结尾
		for (int i = 1; i < intervals.length; i++) {
			if(intervals[i][0] >= cur) {
				count++;
				cur=intervals[i][1];
			}
		}
        //所有区间的个数减去不重叠区间的个数,就是重叠区间的个数。
		return intervals.length - count;
    }
}

标签:int,intervals,算法,详解,区间,最优,贪心
来源: https://blog.csdn.net/qq_52360069/article/details/123596797

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有