两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9 
输出:[0,1] 
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6 
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6 
输出:[0,1]

解题代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
       int[] newNums = Arrays.copyOf(nums, nums.length);
        Arrays.sort(newNums);
        int left = 0;
        int right = newNums.length - 1;
        while (left < right) {
            int sum = newNums[left] + newNums[right];
            if (sum > target) {
                right--;
            } else if (sum < target) {
                left++;
            } else {
                break;
            }
        }
        int index1 = -1;
        int index2 = -1;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == newNums[left] && index1 == -1) {
                index1 = i;
            } else if (nums[i] == newNums[right] && index2 == -1) {
                index2 = i;
            }
            if (index1 != -1 && index2 != -1) {
                break;
            }
        }
        return new int[] {index1, index2};
    }
}

解题思路:

这是一个 Java 实现的两数之和问题的解法。下面是每一段的具体解释:

public int[] twoSum(int[] nums, int target) {

这是一个公共方法  twoSum,它接收两个参数: nums 表示需要进行计算的整数数组,target 表示需要满足的条件,即两数之和等于 target。方法返回一个包含两个值的整数数组,这两个值分别是相加等于目标值的两个数在原数组中的下标。

int[] newNums = Arrays.copyOf(nums, nums.length);

将原始数组 nums 复制到新的数组 newNums。

Arrays.sort(newNums);

对新数组 newNums 进行排序。

int left = 0; int right = newNums.length - 1;

定义两个指针 left 和 right,它们分别指向排序后的数组 newNums 的最左侧和最右侧。

while (left < right) { int sum = newNums[left] + newNums[right]; if (sum > target) { right--; } else if (sum < target) { left++; } else { break; } }

在数组 newNums 上执行双指针循环。根据指针指向的两个元素之和与目标值 target 的比较情况,调整指针的位置,直到满足条件(两数之和等于目标值),或者指针重合(没有找到答案)。

int index1 = -1; int index2 = -1; for (int i = 0; i < nums.length; i++) { if (nums[i] == newNums[left] && index1 == -1) { index1 = i; } else if (nums[i] == newNums[right] && index2 == -1) { index2 = i; } if (index1 != -1 && index2 != -1) { break; } }

根据有序数组 newNums 的结果,遍历原始数组 nums,找到相加等于目标值的两个值在原数组中的下标。

return new int[] {index1, index2};

将两个下标封装到一个新的数组中并返回。