两个和II-输入数组已排序

时间:2019-04-04 05:08:00

标签: java

Leetcode#167与#1几乎相同,但是为什么我不能仅添加if条件?

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

twoSum函数应返回两个数字的索引,以使它们加起来等于目标,其中index1必须小于index2。

注意:

您返回的答案(索引1和索引2)都不基于零。 您可能会假设每个输入都只有一个解决方案,并且您可能不会两次使用同一元素。

示例:     输入:数字= [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?我的错误在哪里?如何解决?

5 个答案:

答案 0 :(得分:1)

因为这个问题说数组从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;
  }
 }

答案 1 :(得分:0)

我已经修改了您的代码,并添加了有关您以前的代码为何出错的代码注释。有关详细信息,请参见下面的代码。

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

样本输入:

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

示例输出:

{{1}}

答案 2 :(得分:0)

您首先从for-loop开始i = 0,而应该从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;
    }
}

注意:我在IF的{​​{1}}之前放置了FOR,这样,如果我们发现没有这样的整数加起来就得出目标整数, '不会抛出main()

答案 3 :(得分:0)

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

[问题]:167。两个和II-输入数组已排序

使用两指针技术:-

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;
    }
}

答案 4 :(得分:-1)

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

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};
  }
}