如何在向量中找到两个最佳权重?

时间:2019-03-08 17:06:58

标签: vector

想象一下,您得到了一个未排序的数组[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),是否可行?]

谁能建议我该如何解决这个问题?它类似于“背包问题”吗?谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用两指针方法解决问题。

算法:

  1. 排序数组。
  2. 具有两个指向0和arraySize-1的指针startIndex和endIndex。
  3. sum = arr [startIndex] + arr [endIndex]
  4. 如果sum小于或等于23,则增加startIndex,否则减少endIndex。
  5. 使用变量跟踪最接近的值。
  6. 当startIndex == endIndex时完成

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)

相关问题