LeetCode算法题---两数之和(一)

简介: LeetCode算法题---两数之和(一)

两数之和


给定一个整数数组 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};


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

目录
相关文章
|
3月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
53 0
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
3月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
38 2
|
3月前
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
50 0
Leetcode第一题(两数之和)
|
3月前
|
存储 C++ 容器
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
18 0
|
5月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
91 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
5月前
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
|
5月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
85 2
|
5月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
57 1
|
5月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
76 1