力扣-1.两数之和TwoSum(js)

本文详细解析了LeetCode上经典题目TwoSum的解题思路与JavaScript实现代码。通过创建Map进行查找,避免了双重循环的复杂度,提高了算法效率。

LeetCode第一题TwoSum(js实现思想参考up JS老毕)

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

思想

1.创建一个 map
2.for循环遍历 nums 数组
3.用 target 减 nums[i] ,以来计算哪个数组和当前的数字相加可以得到 target
4.检查 map 中是否有这个数,如果有,则返回结果,如果没有,就把 nums[i]当作key存入 map 中
5.以此往复

实现代码

// atom-one-night
  var twoSum = function(nums, target) {
    const map = new Map();
    for( let i=0; i<nums.length; i++) {
      const complement = target -nums[i];
      if (map.has(complement)) {
        return [map.get(complement), i];
      } else {
        map.set(nums[i], i);
      }
    }
    return [];
  }

力扣两数问题有多种解决方案,以下为你介绍不同语言方法的实现: #### JavaScript 哈希表解法 ```javascript function twoSum(nums, target) { const numMap = new Map(); for (let i = 0; i < nums.length; i++) { const complement = target - nums[i]; if (numMap.has(complement)) { return [numMap.get(complement), i]; } numMap.set(nums[i], i); } return []; } const nums = [2, 7, 11, 15]; const target = 9; console.log(twoSum(nums, target)); ``` 该方法通过创建一个 `Map` 来存储数字及其索引,一次遍历数组,计算差值 `complement`,如果 `Map` 中存在该差值对应的键,则返回两个索引,否则将当前数字及其索引存入 `Map` 中。若未找到匹配项,返回空数组[^1]。 #### C 语言暴力解法 ```c /** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){ int i,j; int *a=(int*)malloc(sizeof(int)*2); for(i=0;i<numbersSize;i++) { for(j=i+1;j<numbersSize;j++) { if(numbers[i]+numbers[j]==target) { *returnSize=2; a[0]=i+1; a[1]=j+1; return a; } } } *returnSize=0; return 0; } ``` 此方法使用两层循环遍历数组,不重复地检查每对元素的是否等于目标值。若找到满足条件的元素,则将其索引存入新数组并返回;若未找到,返回 `0` 并将 `returnSize` 设为 `0`[^4]。 #### C++ 双指针法(适用于有序数组) 对于一个下标从 1 开始的已按非递减顺序排列的整数数组 `numbers`,可以使用双指针法找出满足相加之等于目标数 `target` 的两个数。双指针分别指向数组的首尾,根据两数与目标值的大小关系移动指针,直到找到满足条件的两个数[^3]。 ```cpp #include <vector> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int left = 0, right = numbers.size() - 1; while (left < right) { int sum = numbers[left] + numbers[right]; if (sum == target) { return {left + 1, right + 1}; } else if (sum < target) { left++; } else { right--; } } return {}; } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值