1. 两数之和 & 167. 两数之和 II - 输入有序数组
2019-01-09 22:18
387 查看
1. 两数之和
题目内容
借鉴大佬https://www.cnblogs.com/ariel-dreamland/p/8662906.html
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路
通过中内容,建立相应的集合map较为合适,因为要返回索引,故利用for循环将nums[i]作为key,将i作为value。之后用t =target-nums;将t放进map就能获得对应的value。要注意判断遍历的数字不能时第一个数字,比如target是6,遍历到了一个3,那么另外一个3不能是之前那个3,
整个实现步骤为:先遍历一遍数组,建立HashMap映射,然后再遍历一遍,开始查找,找到则记录index。代码实现
c++版
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int> m;//无序集合 vector<int> res; for(int i = 0;i<nums.size();i++){ m[nums[i]]=i;//将nums[i]放进key,将i放进value } for(int i = 0;i <nums.size();i++){ int t =target-nums[i]; if(m.count(t)&&m[t]!=i){ res.push_back(i);//返回第一个索引 res.push_back(m[t]);//返回第二个索引 break;//跳出循环,避免加入下一个对应的索引 } } return res;//!!!千万别忘了return } };
官方题解java版
public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[] { map.get(complement), i }; } map.put(nums[i], i); } throw new IllegalArgumentException("No two sum solution"); }
167. 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
解题思路
- 法一很明显,这个有序数组也可以用以上方法,然后只需要遍历数组(因为是有序的,从小到大,遍历到一个符合条件的值就停止循环)即可求解.
- 法二,有序数组很容易想到二分查找,利用两数之和与target做比较,然后移动指针就可以得到解。
class Solution{ public: vector<int> twoSum(vector<int> &nums,int target){ int l = 0; int r = nums.size()-1; vector<int> res;//vector<int> a(2);也可以给好长度 while(l<r){ if(nums[l]+nums[r]==target){ res.push_back(l+1); res.push_back(r+1); return res;//找到就立刻跳出循环,返回结果 } else if(nums[l]+nums[r]>target){ r--; } else{ l++; } } return res; } };
相关文章推荐
- 数组学习5——167. 两数之和 II - 输入有序数组
- LeetCode 167. 两数之和 II - 输入有序数组 Python
- leetcode167. 两数之和 II - 输入有序数组
- LeetCode - 167. 两数之和 II - 输入有序数组
- LeetCode167. 两数之和 II - 输入有序数组(java)
- 【LeetCode】Python实现-167. 两数之和 II - 输入有序数组
- [leetcode]两数之和 II - 输入有序数组[javascript]
- leetcode 两数之和 II - 输入有序数组 python
- Leetcode题库-两数之和 II - 输入有序数组(java语言版)
- Two Sum II - Input array is sorted 两数之和之二 - 输入数组有序
- [LeetCode] Two Sum II - Input array is sorted 两数之和之二 - 输入数组有序
- 两数之和 II - 输入有序数组 - LeetCode
- leetcode160 两数之和 II - 输入有序数组--解法
- 167. 两数之和 II - 输入有序数组
- 【leetcode】Two Sum II - Input array is sorted(输入有序的数组,求两个数的和)
- Leetcode 167.两数之和II-输入有序数组
- [LeetCode] 167. Two Sum II - Input array is sorted 两数和 II - 输入是有序的数组
- LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)
- [LeetCode]167. Two Sum II - Input array is sorted(输入两数和 II - 输出排序数组这两数位置)
- 输入一个数插入有序数组中