力扣1.两数之和 {所用算法:1.【暴力】、2.【哈希表】}

力扣1.两数之和

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

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

示例:

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

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


暴力

暴力1

//j在前,i在后,使用二维数组res来装答案;
//需要注意的点,1判断元素是否重合,2输出的答案只有一组。
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;//将找到的结果放入res里面
        for (int i = 1; i < nums.size(); i ++ ){//i是走在后面
            for (int j = 0; j < i; j ++ ){//j在i前面,每次做到i的前一个位置,这就保证了同一个元素只能只用一遍这个条件
                if (nums[i] + nums[j] == target) {//满足条件
                    res = vector<int> ({j, i});//将数据放入res里面
                    break;//每种输入只对应一个答案,所以当我们成功找到结果是就退出来
                }
            }
            if (res.size() > 0) break;//如果res里有多个答案的时候,我们就退出
        }
        return res;//返回答案
    }
};

暴力2

//~~解释:由public内的定义知,返回值得类型,肯定是一个二维数组,或者两个数【我也不知道,所以这句话希望有大佬可以指点一下】~~ 
//i在前,j在后。直接返回i,j
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i, j;
        for (i = 0; i < nums.size(); i ++ ){
            for (j = i + 1; j < nums.size(); j ++ ){
                if (nums[i] + nums[j] == target) 
                    return {i, j};
            }
        }
        return {i, j};
    }
};

/*
注解:就是关于最后一个return
虽然本题里面说了一定有解,所以在for内部就会有返回了,
但是力扣在测评的时候会检测是否所有情况都具有返回的情况,
为了不报错,我们还是要加上这么一句

也可以写为
return {};
return {0};
return {0,0;
return {10,100};
return {10, 100, 0};
这里的return不会被执行。
以上都是对的,都经过本人亲测以及漫长的等待!(吐槽:力扣真的好慢呀(#*^*#))
*/

/*
注解:为啥要写成return {};等操作,而不是return 0; 呢?
这是因为声明函数类型的时候使用的vector,
如果是int类型,就要return 0;了。

哈希表

哈希表1

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int , int> heap;//前一个int是key,有一个int是value
        for (int i = 0; i < nums.size(); i ++ ){
            int t = target - nums[i];
            if (heap.count(t)) return {heap[t], i};
            heap[nums[i]] = i;
            //heap[当前数字] = 当前数字的索引
        }
        return {};
    }
};
/*
unordered_map  使用find的时候,返回的是一个iterator
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值