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};


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

目录
相关文章
|
10月前
|
索引 容器
两数之和(每天刷力扣hot100系列)
本题要求在数组中找出两数之和等于目标值的下标。解法一为暴力枚举,时间复杂度O(N²),空间复杂度O(1);解法二利用哈希表,将查找时间降为O(1),总时间复杂度O(N),空间复杂度O(N),实现以空间换时间的优化。
|
10月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
248 0
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
480 4
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
460 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
348 2
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
522 0
Leetcode第一题(两数之和)
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
|
存储 C++ 容器
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
188 0
LeetCode第1题两数之和
该文章介绍了 LeetCode 第 1 题两数之和的解法,通过使用 HashMap 来记录数组元素及其下标,以 O(n)的时间复杂度解决问题。

热门文章

最新文章