主页 > 游戏开发  > 

两数之和[中等]

两数之和[中等]

优质博文:IT-BLOG-CN

一、题目

给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1 <= index1 < index2 <= numbers.length。以长度为2的整数数组[index1, index2]的形式返回这两个整数的下标index1和index2。你可以假设每个输入 只对应唯一的答案 ,而且你不可以重复使用相同的元素。你所设计的解决方案必须只使用常量级的额外空间。

示例 1: 输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2与7之和等于目标数9。因此index1 = 1, index2 = 2。返回[1, 2]。

示例 2: 输入:numbers = [2,3,4], target = 6 输出:[1,3] 解释:2与4之和等于目标数6。因此index1 = 1, index2 = 3。返回[1, 3]。

示例 3: 输入:numbers = [-1,0], target = -1 输出:[1,2] 解释:-1与0之和等于目标数-1。因此index1 = 1, index2 = 2。返回[1, 2]。

2 <= numbers.length <= 3 * 104 -1000 <= numbers[i] <= 1000 numbers按非递减顺序排列 -1000 <= target <= 1000 仅存在一个有效答案

二、代码

【1】使用二分查找法: 通过target - numbers[i]得到目标值,然后根据二分查找目标值,二分查找小于目标值,取右边进行递归,否则取左边的数据进行递归。

class Solution { public int[] twoSum(int[] numbers, int target) { // 通过 target - numbers[i] 得到目标值,然后根据二分查找目标值,二分查找小于目标值,取右边进行递归,否则取左边的数据进行递归。 int left = 0, right = 0, val = 0, mid = 0; for (int i = 0; i < numbers.length; i++) { left = i + 1; right = numbers.length - 1; // 需要查找的值 val = target - numbers[i]; // 中间数据 while(left <= right) { mid = (right - left) / 2 + left; // 循环退出条件 if (numbers[mid] == val) { return new int[] {i + 1 , mid + 1}; } // 如果中间值大于目标值,二分查找左边数组,否则查找右边数组 if (numbers[mid] > val) { right = mid; } else { left = mid + 1; } } } return new int[]{-1,-1}; } }

时间复杂度: O(nlog⁡n)其中n是数组的长度。需要遍历数组一次确定第一个数,时间复杂度是O(n),寻找第二个数使用二分查找,时间复杂度是O(log⁡n),因此总时间复杂度是O(nlog⁡n)。 空间复杂度: O(1)

【2】双指针: 初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目标值,则将右侧指针左移一位。移动指针之后,重复上述操作,直到找到答案。

class Solution { public int[] twoSum(int[] numbers, int target) { // 思想:将左右指针累加后,如果sum > target 右指针-1,sum < target 左指针 + 1 int left = 0 , right = numbers.length - 1; while (left < right) { int sum = numbers[left] + numbers[right]; if (sum == target) { return new int[]{left + 1 , right + 1}; } else if (sum > target){ --right; }else { ++left; } } return new int[]{-1,-1}; } }

时间复杂度: O(n)其中n是数组的长度。两个指针移动的总次数最多为n次。 空间复杂度: O(1)

标签:

两数之和[中等]由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“两数之和[中等]