- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
题解
1.双循环
public int[] twoSum(int[] numbers, int target) {
// 一个指针从左边开始,每移动一次,右指针从数组尾部移动到左指针的位置
int left = 0;
int right = 0;
int leftValue = 0;
int rightValue = 0;
// 标志找到
int flag = 0;
// 左指针启动
while (left < numbers.length -1) {
leftValue = numbers[left];
right = numbers.length -1;
// 右指针遍历剩余元素 ,并且进行判断
while (right > left) {
rightValue = numbers[right];
if (leftValue + rightValue == target) {
flag = 1;
break;
}
right --;
}
if (flag ==1) {
break;
}
left ++;
}
int[] result = {left+1,right+1};
return result;
}
2.使用双指针比较缩进
多使用两个临时指针用于代替小循环,在大循环执行一圈时,小循环使用temp的两个指针代替
1.两个临时指针起始位置为左右指针.临时指针相加与目标值进行比较.由于是顺序排列,如果比目标值大,那么右临时指针向左走一步,如果比目标值大,左临时指针向右走一步. 2.当两个临时指针碰到,说明这次循环没有找到.那么左右指针向内各进一步,两个临时指针等于左右指针
- 当小于时,左指针向后进一步.
- 当大于时,右指针向前退一步.
- 当两者相遇时,相当于结束小循环.指针都向前一步.
注意点:临时指针赋值需要在小循环相遇的时候再进行计算.放在外面会对每次循环产生影响.
public static int[] twoSum(int[] numbers, int target) {
// 一个指针从左边开始,每移动一次,右指针从数组尾部移动到左指针的位置
int left = 0;
int right = numbers.length -1;
int leftValue = 0;
int rightValue = 0;
int leftTemp = 0;
int rightTemp = right;
while (left < right) {
leftValue = numbers[leftTemp];
rightValue = numbers[rightTemp];
if (leftValue + rightValue < target) {
leftTemp ++;
}else if (leftValue + rightValue > target) {
rightTemp --;
}else
break;
// 指针相遇,跳过这次
if (leftTemp == rightTemp) {
left ++;
right --;
leftTemp = left;
rightTemp = right;
}
}
int[] result = {leftTemp+1,rightTemp+1};
return result;
}