java 公共区间_java 贪心算法(无重复区间)

本文通过示例介绍了如何使用Java贪心算法解决无重复区间的问题,通过将区间按end排序,再按start排序,从而找到需要移除的最少区间数,确保剩余区间不重叠。
摘要由CSDN通过智能技术生成

java 贪心算法(无重复区间)

java 贪心算法(无重复区间)

java 贪心算法(无重复区间)

*************************

贪心算法

算法描述:原问题可拆解为多阶段进行,每个阶段都做出当前阶段的最优选择(当前阶段最优不一定是全局最优)

适用场景:如果当前阶段做出的选择是否为全局最优与后续阶段的选择无关(无后效性),则可使用贪心算法

不适用示例:三角形最短路径和

7a36fe4e2c22410e998aeea75d2714ff.png

贪心算法解:2 ==> 3 ==> 5 ==> 1,为全局最优解

cf0bbdf2f9d8ef370edd6f9bba9dee4f.png

贪心算法解:2 ==> 3 ==> 60 ==> 1,不是全局最优解

全局最优解:2 ==> 4 ==> 7 ==> 3

三角形最短路径当前阶段的解是否为全局最优解与后续阶段的选取有关(即存在后效性),不可用贪心算法

*************************

示例:无重复区间

问题描述

给定一个区间集合,找到需要一处的区间的最小数量,使得剩余的空间不重叠

注意:可以假定区间的终点总是大于区间的起点;

区间[1,2]、[2,3]有接触,但是不重叠

示例 1:[1,2], [2,3], [3,4], [1,3]

输出:1, 移除[1,3]后,剩余区间不重叠

示例 2:[1,2], [1,2], [1,2]

输出:2,移除2个[1,2]后,剩余区间不重叠

示例 3:[1,2], [2,3]

输出:0, 原始区间不重叠

贪心算法:将区间按end排序,再按start排序,如果区间重叠,移除后面的区间

class Interval implements Comparable {

private Integer start;

private Integer end;

public Integer getStart() {

return start;

}

public void setStart(Integer start) {

this.start = start;

}

public Integer getEnd() {

return end;

}

public void setEnd(Integer end) {

this.end = end;

}

@Override

public int compareTo(Interval o) {

if (this.getEnd()

return -1;

}

if (this.getEnd()>o.getEnd()){

return 1;

}

return this.getStart().compareTo(o.getStart());

}

@Override

public String toString() {

return "["+this.getStart()+","+this.getEnd()+"] ";

}

}

public class MyTest {

public static List generate(int num){

Random random=new Random();

List list=new ArrayList<>();

for (int i=0;i

Interval interval=new Interval();

int start=random.nextInt(100);

int end=start+random.nextInt(20)+1;

interval.setStart(start);

interval.setEnd(end);

list.add(interval);

}

return list;

}

public static void main(String[] args){

List list=generate(10);

System.out.println("初始区间为:");

list.forEach(System.out::print);

Collections.sort(list);

System.out.println("\n\n区间排序后:");

list.forEach(System.out::print);

int count=0;

for (int i=0;i

for (int j=i+1;j

if (list.get(i).getEnd()>list.get(j).getStart()){

list.remove(j);

count++;

}else {

j++;

}

}

}

System.out.println("\n\n移除的区间数为:"+count);

System.out.println("移除后区间为:");

list.forEach(System.out::print);

}

}

控制台输出

初始区间为:

[77,80] [86,88] [68,79] [93,113] [44,62] [28,31] [57,65] [32,49] [89,100] [66,67]

区间排序后:

[28,31] [32,49] [44,62] [57,65] [66,67] [68,79] [77,80] [86,88] [89,100] [93,113]

移除的区间数为:3

移除后区间为:

[28,31] [32,49] [57,65] [66,67] [68,79] [86,88] [89,100]

java 贪心算法(无重复区间)相关教程

Web - JS掌握JavaScript中的数组、循环、函数等技术的使用(网页

Web - JS掌握JavaScript中的数组、循环、函数等技术的使用(网页轮播图) 完成网页轮播图效果,配套的还有随机点名器训练。 代码写得有一些乱,其中有些问题的解决方案也不算好,勉勉强强的自己完成了这个任务训练,0.0~ 代码如下 !DOCTYPE htmlhtml lang=enhea

JavaScript高级程序设计学习笔记(六) —对象,类和继承

JavaScript高级程序设计学习笔记(六) —对象,类和继承 对象,类与面向对象编程 let person = new Object();person.name = tom;console.log(person.name); 属性的类型 js会使用一些内部特性来描述属性的特征,但是开发者不能再js中直接访问,为了将某个特性标

了解JAVA中的装箱与拆箱

了解JAVA中的装箱与拆箱 Java为每种基本数据类型都提供了对应的包装器类型,int对应Integer、boolean对应Boolean。。。 所以,装箱就是将基本数据类型转换为包装器类型;拆箱就是将包装器类型转换为基本数据类型。那自动装箱与自动拆箱也很好理解了,就是我们

Java限流之 —— Sentinel初识

Java限流之 —— Sentinel初识 在之前的篇章中,我们聊到了限流的常用解决方案,基于限流衍生出了一些适合在并发场景下的解决方案,常用的像单机模式下的guawa限流,基于原生的限流算法如漏桶、令牌桶等封装出限流逻辑,redis+lua限流,甚至可以利用nginx做限

【算法】剑指 Offer 45. 把数组排成最小的数

【算法】剑指 Offer 45. 把数组排成最小的数 题目描述 解题思路 方法一:快速排序 python版本 class Solution: def minNumber(self, nums: List[int]) - str: def fast_sort(l , r): if l = r: return i, j = l, r while i j: while strs[j] + strs[l] = strs

java中的加密与解密算法

java中的加密与解密算法 对称加密、非对称加密、摘要算法的区别在哪里? 一、对称加密技术 对称加密特点是加密和解密的过程使用相同的密钥(也叫做key),也就是说加密的时候使用的秘钥,在解密的时候也要用这个密钥,这种方法在密码学中叫做 对称加密算法 ,

【刷题1】LeetCode 221. 最大正方形 java题解

【刷题1】LeetCode 221. 最大正方形 java题解 1.题目 2.解法一 用dp[i][j]表示右下角为(i-1,j-1)的正方形的最大边长。 转移方程: if(grid[i - 1][j - 1] == ‘1’),dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1。 类似木桶效应,取左边的,上边的,

JAVA简单图书管理系统

JAVA简单图书管理系统 //建议采用不同的类来保存众多方法 import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; import javax.swing.JOptionPane; public class Main { static Scanner input = new Scanner(System.in);static

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值