java - 匹配的盖子和罐子实施
问题描述
此处描述了该问题,实现将盖子与正确大小的罐子匹配的算法。
这是我的实现
public class MyMatcher implements Matcher {
private List<Pair> res = new ArrayList<>();
@Override
public List<Pair> match(List<Jar> jars, List<Lid> lids) {
int n = jars.size()-1;
List<Jar> jsorted = quickSortPivotLid(jars,lids,0,n);
List<Lid> lsorted = quickSortPivotJar(jars,lids,0,n);
for(int i=0; i<=n; i++){
res.add(new Pair(jsorted.get(i),lsorted.get(i)));
}
return res;
}
private List<Jar> quickSortPivotLid(List<Jar> jars, List<Lid> lids, int left, int right){
if(left>=right){
return jars;
}
int pi = partitionPivotLid(jars,lids,left,right);
quickSortPivotLid(jars,lids,left,pi);
quickSortPivotLid(jars,lids,pi+1,right);
return jars;
}
private int partitionPivotLid(List<Jar> jars, List<Lid> lids, int left, int right){
List<Jar> copy = new ArrayList<Jar>();
for(Jar jar: jars){
copy.add(jar);
}
Lid pivot = lids.get(left);
int ind = -1; //index of jar that corresponds to pivotal lid;
int l = left;
while(copy.get(l).compareTo(pivot)!=0) {
l++;
}
if(copy.get(l).compareTo(pivot)==0){
ind = l;
}
Collections.swap(copy,ind,left);
int i = left;
for(int j=left+1; j<=right; j++){
if(copy.get(j).compareTo(spil)<=0){
i++;
Collections.swap(copy,i,j);
}
}
Collections.swap(copy,left,i);
return i;
}
private List<Lid> quickSortPivotJar(List<Jar> jars, List<Lid> lids, int left, int right){
if(left>=right){
return lids;
}
int pi = partitionPivotJar(jars,lids,left,right);
quickSortPivotLid(jars,lids,left,pi);
quickSortPivotLid(jars,lids,pi+1,right);
return lids;
}
private int partitionPivotJar(List<Jar> jars, List<Lid> lids, int left, int right){
List<Lid> copy = new ArrayList<Lid>();
for(Lid lid: lids){
copy.add(lid);
}
Jar pivot = jars.get(left);
int ind = -1;
int l = left;
while(copy.get(l).compareTo(pivot)!=0) {
l++;
}
if(copy.get(l).compareTo(pivot)==0){
ind = l;
}
Collections.swap(copy,ind,left);
int i = left;
for(int j=left+1; j<=right; j++){
if(copy.get(j).compareTo(pivot)<=0){
i++;
Collections.swap(copy,i,j);
}
}
Collections.swap(copy,left,i);
return i;
}
}
注意:QuickSortPivotLid 使用一个枢轴盖,partitionPivotLid 使用这个枢轴盖对罐子列表进行分区。
这段代码看起来像是一个合理的解决方案吗?可以缩短吗?
谢谢。
解决方案
推荐阅读
- jquery - jQuery 定价计算器
- sql - 为 17 个表选择 MSSQL 服务器中的所有数据
- python - AWS Lambda 函数 (Python) 中的单例实例生命周期
- sql-server - 使用云数据融合创建从 SQL Server 到 BigQuery 的数据管道的问题
- r - 如何在r软件中打开grib文件
- hybris - 删除不需要的产品属性
- javascript - 使用对象参数作为函数的参数
- sqoop - Sqoop 批量导出到 SQL Server
- python - 具有大项目数的 QComboBox 的初始显示性能缓慢
- aws-lambda - 如何防止 dynamoDB 中的覆盖/重复触发 lambda