java 贪心算法(无重复区间)
java 贪心算法(无重复区间)
java 贪心算法(无重复区间)
*************************
贪心算法
算法描述:原问题可拆解为多阶段进行,每个阶段都做出当前阶段的最优选择(当前阶段最优不一定是全局最优)
适用场景:如果当前阶段做出的选择是否为全局最优与后续阶段的选择无关(无后效性),则可使用贪心算法
不适用示例:三角形最短路径和
贪心算法解:2 ==> 3 ==> 5 ==> 1,为全局最优解
贪心算法解: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