想象一下,您得到了一个未排序的数组[5,11,7,4,19,8,11,6,17]和最大权重23。[类似于两次和问题,但有一点不同]
在这种情况下,需要找到两个最佳权重(我的意思是说两个权重是否(几乎是)您要查找的权重的一半)[5,17],[3,19] ,[11,11],所以我需要返回[11,11]。
我被这个问题带回了,无法解决。 [不允许使用结构]
我尝试对[3、5、6、7、8、11、11、17、19]进行排序,并从两端进行搜索,并将小于等于最大权重的值的索引成对存储在一个向量中(例如v [i],v [i + 1],然后再按配对检查它们),然后返回两个都有最大val的配对,但感到困惑。
[尽管权重是两倍,但我没有在那个集合上看到重复项,所以我没有使用unsorted_map(hashMap),是否可行?]
谁能建议我该如何解决这个问题?它类似于“背包问题”吗?谢谢
答案 0 :(得分:0)
您可以使用两指针方法解决问题。
算法:
Java代码:
public class Solution {
private ArrayList<Integer> twoSumClosest(ArrayList<Integer> a, int s) {
// Sort the arraylist
Collections.sort(a);
// closests sum we got till now
int sumClosest = Integer.MIN_VALUE;
// indexes used to traverse
int startIndex = 0;
int endIndex = a.size() - 1 ;
// answer Indexes
int firstIndex = 1;
int secondIndex = a.size() - 1;
while( startIndex < endIndex ) {
if( a.get(startIndex) + a.get(endIndex) > s) {
endIndex--;
continue;
} else {
if( a.get(startIndex) + a.get(endIndex) > sumClosest ) {
sumClosest = a.get(startIndex) + a.get(endIndex);
firstIndex = startIndex;
secondIndex = endIndex;
}
startIndex++;
}
}
ArrayList<Integer> ans = new ArrayList<>();
ans.add(firstIndex);
ans.add(secondIndex);
return ans;
}
}
时间复杂度: O(n)
需要额外的空间:O(1)