给出一对数字对的列表,例如[(1,4),(2,5),(7、3),(4,6),(7,7)]。查找最长的子列表,该列表具有按第一个条目按升序排列,第二个按降序排列的对。对此任务的答案是[(2,5),(7,3)]。
我用两个字段创建了对象“ Pair”:“ first”和“ second”:
class Pair{
int first;
int second;
public Pair(int first, int second) {
this.first = first;
this.second = second;
}
}
接下来,我创建了一个'Pair'类型的数组,并用'Pair'对象填充了这些数组:
Pair arrPair[] = new Pair[5];
arrPair[0] = new Pair(1, 4);
arrPair[1] = new Pair(2, 5);
arrPair[2] = new Pair(7, 3);
arrPair[3] = new Pair(4, 6);
arrPair[4] = new Pair(7, 7);
据我所知,我应该编写一些循环来比较arrPair []的元素。但是我不知道这个循环应该如何工作和看起来,如何获得结果以及在哪里。
你能帮我吗?
答案 0 :(得分:0)
首先,您可以在Pair类中添加三个函数。 第一个应该是
isAscending() {
return this.first < this.second;
}
第二个应该是
isDescending() {
return this.first > this.second;
}
第三个应该是
range() {
if(isAscending())
return this.second - this.first;
return this.first - this.second;
}
您可以创建两个变量,以托管升序对和降序对的最长子列表。然后,(1)您必须遍历数组(2)确定当前对是升序还是下降(3)确定该对是否长于先前的最大值。
示例(或多或少的伪代码):
myCurrentLongestAscending = new Pair(0,0);
myCurrentLongestDecending = new Pair(0,0);
for (Pair currentPair : myPairs){
if( currentPair.isAscending() && currentPair.range() > myCurrentLongestAscending.range()){
myCurrentLongestAscending = currentPair;
else if( currentPair.isDescending() && currentPair.range() > myCurrentLongestDecending .range()) {
myCurrentLongestDecending = currentPair;
}
}
myResult = [myCurrentLongestAscending, myCurrentLongestDecending];