问题描述
问题:给定一个数组 arr[] 表示 N 个塔的高度和一个正整数 K,您必须通过将它们增加或减少一次 K 来修改每个塔的高度。修改后高度为非负整数。 找出修改每个塔后最短和最长塔的高度可能的最小差异。
我的代码通过了基本的测试用例,所以我想我的逻辑是有效的。但是在提交 IndexOutOfBoundException 之后。请看代码并指出问题。 https://practice.geeksforgeeks.org/problems/minimize-the-heights/0
class Pair{
private int index;
private int value;
Pair(int index,int value){
this.index=index;
this.value=value;
}
public int getIndex(){
return this.index;
}
public int getValue(){
return this.value;
}
}
class Solution {
int getMinDiff(int[] a,int n,int k) {
ArrayList<Pair> possibleHeights =new ArrayList<Pair>();
int [] visited = new int[n];
// for(int i=0;i<n;i++){
// System.out.println(a[i]-k);
// }
for(int i=0;i<n;i++){
if((a[i]-k)>=0)
possibleHeights.add(new Pair(i,a[i]-k));
possibleHeights.add(new Pair(i,a[i]+k));
visited[i]=0;
}
// for(int i=0;i<possibleHeights.size();i++){
// System.out.println(possibleHeights.get(i).getIndex()+"--"+possibleHeights.get(i).getValue());
// }
// System.out.println("---------");
Collections.sort(possibleHeights,new Comparator<Pair>(){
public int compare(Pair p1,Pair p2){
return p1.getValue()-p2.getValue();
}
});
// for(int i=0;i<possibleHeights.size();i++){
// System.out.println(possibleHeights.get(i).getIndex()+"--"+possibleHeights.get(i).getValue());
// }
int left=0,right=0,ele=0,size=possibleHeights.size();
while(ele<n&&right<size&&left<size){
if(visited[possibleHeights.get(right).getIndex()]==0)
ele++;
visited[possibleHeights.get(right).getIndex()]++;
right++;
}
int ans = possibleHeights.get(right-1).getValue()- possibleHeights.get(left).getValue();
while(right<size&&left<size){
if(possibleHeights.get(left).getIndex()==1)
ele--;
visited[possibleHeights.get(left).getIndex()]--;
left++;
while(ele<n&&right<size){
if(visited[possibleHeights.get(right).getIndex()]==0)
ele++;
visited[possibleHeights.get(right).getIndex()]++;
right++;
}
int temp=possibleHeights.get(right-1).getValue()- possibleHeights.get(left).getValue();
if(ele==n)
ans=ans<temp?ans:temp;
else
break;
}
return ans;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)