题意
给定一个整数数组nums
和一个整数目标值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]
提示:
-
2 <= nums.length <= 103
-
-109 <= nums[i] <= 109
-
-109 <= target <= 109
-
只会存在一个有效答案
出处
链接:https://leetcode-cn.com/problems/two-sum
思路
抓重点就是,在数组 nums 中找两个元素使其与目标值 target 相等,规则是数组 nums 里面的每一个元素只能使用一次,为了让程序更加容易通过,出题人限定了输入的输出答案有且仅有一个,而且不需要你考虑顺序,你只需要返回其下标就好了。
最通用的手段,暴力破解嘛,两层循环分别找出元素中的两个值,如果与目标 target 值吻合就返回下标,退出程序。
代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
const twoSum = function (nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
return [i, j];
}
}
}
};
export default twoSum;
测试
import twoSum from '../../code/leetcode/1';
describe('test function twoSum:', () => {
test('test case nums = [3, 3], target = 6', () => {
const data = twoSum([3, 3], 6);
expect(data).toEqual([0, 1]);
});
test('test case nums = [2,7,11,15], target = 9', () => {
const data = twoSum([2, 7, 11, 15], 9);
expect(data).toEqual([0, 1]);
});
test('test case nums = [3,2,4], target = 6', () => {
const data = twoSum([3, 2, 4], 6);
expect(data).toEqual([1, 2]);
});
});
思考
-
有没有更好的解法
-
存在多个有效答案是什么情况?
-
按从小到大的顺序返回是什么情况?
-
如果改成和为目标值的三个整数呢?
这里笔者象征性地提了几个问题,供读者们阅读后思考,挖坑不填坑哈哈,欢迎在留言下方评论,分享你的见解和想法。
说明
本文首发于 GitHub 仓库https://github.com/ataola/coding
,线上阅读地址:https://zhengjiangtao.cn/coding/
,转载请注明出处,谢谢!