力扣1. 两数之和——《解题者:力扣解题之路》

力扣1:两数之和
前言:不同于某些OJ,力扣第一题对初学者不是很友好,初次看到它,可能一时想不到思路——但须知万事开头难,走出第一步,即相当于成功一半——
而:我将为你认认真真地解开它ヾ(◍°∇°◍)ノ゙


力扣1. 两数之和——《解题者:力扣解题之路》_第1张图片


关键词索引:哈希映射、BF、力扣第一题

目录:

  • 题目描述:
  • 题意补充:
  • 思路|破解:
    • A解:BF蛮力枚举
      • 思路标识:
      • 解题:
    • B解:Hash哈希映射
      • 思路标识:
      • 解题:
      • 动态图解o(* ^ ▽ ^ *)┛:
  • 知识回顾:
  • 后记:
  • 回到《解题者:力扣解题之路》目录:

题目描述:


给定一个整数数组 nums 和一个整数目标值 target ,请你在该数组中找出 和为目标值 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]

提示:
力扣1. 两数之和——《解题者:力扣解题之路》_第2张图片



思路|破解:

A解:BF蛮力枚举

思路标识:

  • 1-》数据明确给出:数组的长度为 104 (程序员下意识地判断:这是一个相对较小的数)
  • 2-》求两数之和,这意味这我们只需 两重循环 即可
  • 3-》第一重:for i:0=>n-2,第二重:for j:i+1=>n-1,枚举出nums中数字的所有两两组合,遍历所有情况。
  • 4-》时间复杂度为O(n2)

解题:

class Solution {
public:
    vector<int>twoSum(vector<int>& nums, int target) {
    for(int i=0;i<nums.size()-1;i++){
        for(int j=i+1;j<nums.size();j++){
            if(nums[i]+nums[j]==target)return {i,j};
        }
    }
    return {};
    }
};


B解:Hash哈希映射


思路标识:

  • 1-》从A解中我们可以看到:第二重循环的实质无非是对 target-nums[i] 【查找】 ——
  • 2-》对于 查找 操作,我们很容易想到 【哈希表】 ,通过 键值 可以快速查找到 它对应的值,哈希表最理想情况下的时间复杂度仅为O(1)
  • 3-》将第二重循环变成哈希查找,可以极大地加快时间

解题:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    unordered_map<int,int>hash;
    for(int i=0;i<nums.size();++i){
        unordered_map<int,int>::iterator it=hash.find(target-nums[i]);
        if(it!=hash.end()){
            return {it->second,i};
        }
            hash[nums[i]] = i;
    }
    return {};
    }
};

动态图解o(* ^ ▽ ^ *)┛:

力扣1. 两数之和——《解题者:力扣解题之路》_第3张图片



知识回顾:

  1. 对数据规模较小的问题,可以使用 蛮力枚举(BF)
  2. 哈希表(散列表),是根据关键码值(key)直接进行访问的数据结构。可以利用它,大大提高查找效率, 属于以空间换时间的典型策略

后记:

这样的题解我还是有点满意的(~ ̄▽ ̄)~迈开第一步,就是新的开始,《解题者:力扣解题之路》现在算正式开始了
愿我们一同努力,解破算法难题。
力扣1. 两数之和——《解题者:力扣解题之路》_第4张图片


回到《解题者:力扣解题之路》目录:

O(∩_∩)O 《解题者:力扣解题之路》目录传送

你可能感兴趣的:(leetcode,算法,职场和发展,哈希表,两数之和)