【问题标题】:Two Sum II - Input array is sorted两个 Sum II - 输入数组已排序
【发布时间】:2019-04-04 05:07:59
【问题描述】:

Leetcode #167 和 #1 几乎一样,但是为什么我不能只添加一个 if 条件呢?

问:给定一个已经按升序排序的整数数组,找到两个数字,使它们加起来等于特定的目标数字。

函数 twoSum 应该返回两个数字的索引,使得它们相加到目标,其中 index1 必须小于 index2。

注意:

您返回的答案(index1 和 index2)不是从零开始的。 您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。

示例: 输入:数字 = [2,7,11,15],目标 = 9 输出:[1,2]

The sum of 2 and 7 is 9. 
Therefore index1 = 1, index2 = 2.

我的代码:

class Solution {
public int[] twoSum(int[] numbers, int target) {
        for (int i = 1; i < numbers.length; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                if (numbers[j] == target - numbers[i]) {
                    if(numbers[i] < numbers[j])
                        return new int[] { i, j };
        }
    }
}
 return null;
}

}

为什么我总是返回 null?我的错误在哪里?如何解决?

【问题讨论】:

  • 数组索引以0 零开头,而不是1 1 - 检查循环起始值; (只是为了便于阅读,number[i] + number[j] == target 会更自然检查,因为它类似于请求的内容)
  • 我不知道。你应该学会调试你的代码。你为什么在i=1而不是i=0开始你的循环?仅仅因为预期输出不是基于零的并不意味着输入也不是。
  • 您的目标是 9,并且您从索引 1 开始循环数组,因此它从 7 开始,然后尝试添加下一个索引值,因此您没有得到所需的输出。如果从 0 开始循环,则在第 0 索引处的值为 2,第 1 索引处的值为 7,那么您将获得所需的输出。

标签: java


【解决方案1】:

https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/

[question]: 167. Two Sum II - Input array is sorted

使用双指针技术:-

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        if (numbers == null || numbers.length == 0)
            return null;
        int i = 0;
        int j = numbers.length - 1;
        while (i < j) {
            int x = numbers[i] + numbers[j];
            if (x < target) {
                ++i;
            } else if (x > target) {
                j--;
            } else {
                return new int[] { i + 1, j + 1 };
            }
        }
        return null;
    }
}

【讨论】:

【解决方案2】:

这是一个更好的解决方案,因为它速度更快并且还涵盖了所有测试用例:

class Solution {
public int[] twoSum(int[] numbers, int target) {
    int l = 0, r = numbers.length - 1;
    while (numbers[l] + numbers[r] != target) {
        if (numbers[l] + numbers[r] > target) 
            r--;
        else 
            l++;
        if (r == l) return new int[]{};
    }
    return new int[]{l + 1, r + 1};
  }
}

【讨论】:

    【解决方案3】:

    因为问题说数组从 1 开始并不意味着数组在 java 中从 1 开始。如果你想将 i,j 返回为非零,你应该从 1 到 length+1,然后在你应该检查的条件内索引为 i-1,j-1 或从 0 开始并返回 i+1,j+1。

    class Solution {
      public int[] twoSum(int[] numbers, int target) {
        for (int i = 1; i < numbers.length+1; i++) {
            for (int j = i + 1; j < numbers.length+1; j++) {
                if (numbers[j-1] == target - numbers[i-1]) {
                    if(numbers[i-1] < numbers[j-1])
                        return new int[] { i, j };
                }
            }
        }
         return null;
      }
     }
    

    或者你可以这样做,

        class Solution {
      public int[] twoSum(int[] numbers, int target) {
        for (int i = 0; i < numbers.length; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                if (numbers[j] == target - numbers[i]) {
                    if(numbers[i] < numbers[j])
                        return new int[] { i+1, j+1 };
                }
            }
        }
         return null;
      }
     }
    

    【讨论】:

      【解决方案4】:

      我已经修改了您的代码并添加了代码 cmets,说明您之前的代码为何有错误。详情请参考以下代码。

      public class Main {
      
          public static void main(String[] args) {
              int target = 9;
              int[] numbers = new int[] { 2, 7, 11, 15 };
              int[] result = twoSum(numbers, target);
              if (result != null) {
                  System.out
                          .println("The sum of " + numbers[result[0]] + " and " + numbers[result[1]] + " is " + target + ".");
                  System.out.println("Therefore index1 = " + (result[0] + 1) + ", index2 = " + (result[1] + 1));
              } else {
                  System.out.println("No Solution found!");
              }
          }
      
          public static int[] twoSum(int[] numbers, int target) {
              for (int i = 0; i < numbers.length; i++) { // array index starts at 0
                  for (int j = i + 1; j < numbers.length; j++) {
                      if (numbers[j] + numbers[i] == target) { // add the current numbers
                          // if (numbers[i] < numbers[j]) // not needed
                          return new int[] { i, j };
                      }
                  }
              }
              return null;
          }
      
      }
      

      示例输入:

      numbers = [2, 7, 11, 15];
      

      样本输出:

      The sum of 2 and 7 is 9.
      Therefore index1 = 1, index2 = 2
      

      【讨论】:

        【解决方案5】:

        您首先以i = 0 开头for-loop,您应该以i = 1 开头。

        工作代码:

        public class Solution 
        {
            public static void main(String[] args)
            {
                int[] num = {2,7,11,5};
                int n = 13;
                int[] answer = new int[2];
                answer = twoSum(num,n);
                if(answer != null)
                    for(int i=0;i<2;i++)
                        System.out.printf( answer[i] +" ");
            }
        
        
            public static int[] twoSum(int[] numbers, int target)
            {
                for (int i = 0; i < numbers.length; i++) 
                {
                    for (int j = i + 1; j < numbers.length; j++) 
                    {
                        if (numbers[j] == target - numbers[i]) 
                        {
                            if(numbers[i] < numbers[j])
                                return new int[] { i+1, j+1};
                        }
                    }
                }
                return null;
            }
        }
        

        注意:我在main() 中的FOR 之前放置了一个IF,这样如果我们没有找到这样的整数加起来给出目标整数,它就不会抛出一个@ 987654328@.

        【讨论】:

          【解决方案6】:
             public int[] twoSum(int[] nums, int target) {
              int start = 0, end = nums.length -1;
              
              while (start < end){
                  if (nums[start]+ nums[end]== target)
                      return new int []{start+1, end+1};
                  
                  if (nums[start]+ nums[end]> target){
                      end--;}
                  else if (nums[start]+ nums[end]< target){
                      start++;
                  }
              }
              
              return null;    
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-17
            • 1970-01-01
            • 1970-01-01
            • 2019-05-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多