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?我的错误在哪里?如何解决?
答案 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};
}
}