Find all pairs of integers within an array which sum to a specified value

前端 未结 15 2010
隐瞒了意图╮
隐瞒了意图╮ 2020-12-01 08:00

Design an algorithm to find all pairs of integers within an array which sum to a specified value.

I have tried this problem using a hash

15条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-01 08:49

    @Test
    public void hasPairWithSum() {
      assertFalse(hasPairWithSum_Ordered_Logarithmic(new int[] { 1, 2, 3, 9 }, 8));
      assertTrue(hasPairWithSum_Ordered_Logarithmic(new int[] { 1, 2, 4, 4 }, 8));
    
      assertFalse(hasPairWithSum_Ordered_Linear(new int[] { 1, 2, 3, 9 }, 8));
      assertTrue(hasPairWithSum_Ordered_Linear(new int[] { 1, 2, 4, 4 }, 8));
    
      assertFalse(hasPairWithSum_Unsorted_Linear(new int[] { 9, 1, 3, 2 }, 8));
      assertTrue(hasPairWithSum_Unsorted_Linear(new int[] { 4, 2, 1, 4 }, 8));
    
      assertFalse(hasPairWithSum_Unsorted_Quadratic(new int[] { 9, 1, 3, 2 }, 8));
      assertTrue(hasPairWithSum_Unsorted_Quadratic(new int[] { 4, 2, 1, 4 }, 8));
    }
    
    private boolean hasPairWithSum_Ordered_Logarithmic(int[] data, int sum) {
      for (int i = 0; i < data.length; i++) {
        int current = data[i];
        int complement = sum - current;
        int foundIndex = Arrays.binarySearch(data, complement);
        if (foundIndex >= 0 && foundIndex != i) {
          return true;
        }
      }
      return false;
    }
    
    private boolean hasPairWithSum_Ordered_Linear(int[] data, int sum) {
      int low = 0;
      int high = data.length - 1;
      while (low < high) {
        int total = data[low] + data[high];
        if (total == sum) {
          return true;
        } else if (total < sum) {
          low++;
        } else {
          high--;
        }
      }
      return false;
    }
    
    private boolean hasPairWithSum_Unsorted_Linear(int[] data, int sum) {
      Set complements = Sets.newHashSet();
      for (int current : data) {
        if (complements.contains(current)) {
          return true;
        }
        complements.add(sum - current);
      }
      return false;
    }
    
    private boolean hasPairWithSum_Unsorted_Quadratic(int[] data, int sum) {
      for (int i = 0; i < data.length; i++) {
        int current = data[i];
        int complement = sum - current;
        for (int j = 0; j < data.length; j++) {
          if (data[j] == complement && i != j) {
            return true;
          }
        }
      }
      return false;
    }
    

提交回复
热议问题