题目描述

原题连接

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

  1. 给定 nums = [2, 7, 11, 15], target = 9
  2. 因为 nums[0] + nums[1] = 2 + 7 = 9
  3. 所以返回 [0, 1]

个人解法

JavaScript

解法比较暴力

使用两层循环

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function(nums, target) {
  7. var len = nums.length;
  8. for (var i = 0; i < len - 1; i++) {
  9. var j = i + 1;
  10. var sum = undefined;
  11. while (target !== sum && j < len) {
  12. sum = nums[i] + nums[j];
  13. if (target == sum && j != i) {
  14. return [i, j];
  15. } else {
  16. j++;
  17. }
  18. }
  19. }
  20. };

第一次刷题,遇到的问题:

  1. while 循环内 未 加 条件 j < len。循环无法终止
  2. 输入的 数组 为 [0,4,3,0] target = 0 时候 若 sum 初始值为 0 则 返回结果 为 undefined

Java

更优解法

看完之后 看了一下别人的题解

结合了下 哈希表的思路

Java

标签:哈希映射
这道题本身用暴力解法是比较容易解决的,但时间复杂度较高,为O(n_2)。而哈希查找的时间复杂度为_O(1),所以可以利用哈希容器map降低时间复杂度。
遍历数组nums,i(下标为我们设的key值)为当前数组下标,遍历到每个数组元素时,判断map中是否存在target-nums[i]的key值。如果存在则找到了两个值,如果不存在则将当前的(nums[i],i)存入map中,继续遍历直到找到为止。

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. Map<Integer,Integer>harshtable=new HashMap<>();
  4. for(int i=0;i<nums.length;i++){
  5. if(harshtable.containsKey(target-nums[i])){
  6. return new int[] {harshtable.get(target-nums[i]),i};
  7. }
  8. harshtable.put(nums[i],i);
  9. }
  10. return new int[0];
  11. }
  12. }

画解:

1.
image.png
2.
image.png
3.
image.png
4.
image.png

JavaScript

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function(nums, target) {
  7. var temp = [];
  8. for(var i=0;i<nums.length;i++){
  9. var dif = target - nums[i];
  10. if(temp[dif] != undefined){
  11. return [temp[dif],i];
  12. }
  13. temp[nums[i]] = i;
  14. }
  15. };