public int[] twoSum(int[] nums, int target) {
int[] result = {0, 1};
if (nums.length <= 2) {
return new int[0]
}
for (int i = 0; i < nums.length - 1; i++) {
result[0] = i;
int x = target - nums[i];
for (int j = i + 1, k = nums.length - 1; j <= k; j++, k--) {
if (nums[j] == x) {
result[1] = j;
return result;
}
if (nums[k] == x) {
result[1] = k;
return result;
}
}
}
return result;
}
该算法的核心思想是使用双指针从两头往中间寻找匹配的数,从而减少遍历的次数,提高查找的效率。具体实现中,对于数组中的每个数 i,在 [i+1, len(nums)-1] 的区间内使用双指针法寻找另外一个数 j 使得 nums[i]+nums[j]==target。如果收尾指针所指的数之和大于 target,则将右指针左移;否则将左指针右移。重复这个过程直到找到满足要求的数,或者左右指针相遇。
需要注意的是,本题假设每种输入只会对应一个答案,且数组中同一个元素在答案中不能重复出现。同时,有些特殊情况需要单独处理,例如输入的数组长度小于等于2的情况,此时可以直接返回结果[0, 1]。
总的来说,该算法利用双指针减少了遍历的次数,从而提高了查找的效率,时间复杂度为O(nlogn)。