【刷透Leetcode热题100】1.两数之和

题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 :

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

一、JAVA解法

class Solution {
    public int[] twoSum(int[] nums, int target){
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0, j = nums.length - 1;i<=j;i++,j--){
            if(map.containsKey(target - nums[i])){
                return new int[]{map.get(target - nums[i]),i};
            }else{
                map.put(nums[i],i);
            }
            if(map.containsKey(target - nums[j])){
                return new int[]{map.get(target - nums[j]),j};
            }else{
                map.put(nums[j],j);
            }
        }
        return new int[2];
    }
}

二、JAVA复盘

1.双指针法两头遍历

        *注意对于0-indexed列表,最后一项索引是nums.length - 1.(右指针)左右指针的移动是同时的。

2.利用哈希表-键值对的数据结构存储列表索引和内容。

        哈希表是一个性能良好的,针对列表进行观察的第二空间。在各种关于列表的问题中,我们可以用哈希表作为第二空间对某个列表进行遍历--->对各项进行条件判断--->返回/ 存储特定的数据。

        例如在本题中,将符合条件(对于每个i,map里存在对应的number,使得i+number == target。*number = target - nums[i])的数据返回,将不符合条件的数据全都存储在哈希表里,等待后续的检索。由于两头便利,实际上, 二分之nums.length就把列表nums给遍历完了。

        其精髓在于,每一次都把列表的数据拿出来放到map里,并在map里检索是否有符合条件的值,返回值的对应索引——聪明地运用了map“键值对”独特的数据结构。

3.让我们重温哈希表的基本语法:

        ①创建新的哈希表

HashMap<KeyType, ValueType> hashMap = new HashMap<>();

        ②插入键值对-用 .put(键,值)

hashMap.put(key, value);

        ③获取值- 用.get(值的对应键)

ValueType value = hashMap.get(key);

        ④检查键是否存在-用.containsKey(键)

boolean containsKey = hashMap.containsKey(key);

         ⑤删除键值对-用.containsKey(键)

boolean containsKey = hashMap.containsKey(key);

三、Python解法

class Solution(object):
    def twoSum(self, nums, target):
    # 创建一个空的哈希表
        hashmap = {}
    # 遍历数组,同时获取索引和元素值
        for i, num in enumerate(nums):
        # 计算当前元素与目标值的差值
            complement = target - num
        # 检查差值是否在哈希表中
            if complement in hashmap:
            # 如果在,返回差值的索引和当前元素的索引
                return [hashmap[complement], i]
        # 如果差值不在哈希表中,则将当前元素及其索引添加到哈希表中
            hashmap[num] = i

四、Python复盘

 1.复习哈希表基础语法

        ①创建哈希表-python用大括号{}

hash_table = {}  # 创建一个空的哈希表

        ②添加键值对-用键赋值

hash_table[key] = value  # 添加键值对到哈希表中

        ③获取值-用键调取值,赋给一个变量

value = hash_table[key] # 根据键获取对应的值

        ④判断键是否存在-if判断

if key in hash_table: # 键存在于哈希表中 else: # 键不存在于哈希表中

        ⑤删除键值对-del

del hash_table[key] # 删除指定键值对

        ⑥遍历哈希表-for循环

for key in hash_table: value = hash_table[key] # 获取键对应的值 # 对每个键值对执行操作

 2. self是谁

        在 Python 中,实例对象是类的一个具体实例,也就是类的一个具体的对象。在这段代码中,实例对象是 Solution 类的一个实例,它代表了解决问题的实体。

3. enumerate 枚举函数

  enumerate() 函数是 Python 内置函数,用于将一个可迭代对象转换为一个枚举对象,同时返回元素的索引和值。它的语法结构如下:

enumerate(iterable, start = 0)
  • iterable:需要枚举的可迭代对象,例如列表、元组、字符串等。
  • start:可选参数,表示索引起始值,默认为 0。

   enumerate() 函数返回一个迭代器对象——该迭代器产生由索引和元素组成的元组。其中,索引是从 start 开始递增的整数,元素是可迭代对象中的元素。在循环迭代时,可以同时获取元素的索引和值。

        本题里,在代码中的这一行中:

for i, num in enumerate(nums):

  enumerate(nums) 将整数数组 nums 转换为一个枚举对象,然后在每次迭代时,返回一个包含索引 i 和元素值 num 的元组

五、C++解法

#include <vector>
#include <map>
using namespace std;
class Solution
{
public:
  vector<int> twoSum(vector<int> &nums, int target)
  {
    map<int, int> hx;
    for (int i = 0; i < nums.size(); i++)
    {
      auto it = hx.find(target - nums[i]);
      if (it != hx.end())
        return {i, it->second};
      hx[nums[i]] = i;
    }
    return {};
  }
};

六、C++复盘

1.vector<int> 向量:动态列表

2.auto 自判断的数据类型

3.it 迭代器,判断是否走到哈希表末尾

其实也是用哈希表存储和判断,但是用的是迭代器,方便一些。

七、思路与问题

到底是谁决定了时间复杂度低?遍历谁?-遍历列表nums

利用迭代器遍历。-什么是迭代器?

如何想到默认把不符合条件的数据存入哈希表,并在哈希表里查找符合条件的键值对

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值