leetcode解题报告1. Two Sum

leetcode解题报告1. Two Sum

题目地址

难度是easy

题目描述

给定一个整数数组和一个目标结果,找出数组里两个数,使得两个数的和是目标结果。每个数不能重复使用。保证有且只有一个解。

我的思路

暴力求解,嵌套遍历数组两遍,即可。
其中有一些细节可以优化。

我的代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int size = nums.size();
        for (int i = 0; i < (size - 1); i++) {
            int tt = target - nums[i]; //优化点,预先减,避免后面比较时的相加操作。
            for (int j = i + 1; j < size; j++) {
                if (nums[j] == tt) {
                    vector<int> ans;
                    ans.push_back(i);
                    ans.push_back(j);
                    return ans;
                }
            }
        }
    }
};

阅读官方题解

官方题解

暴力求法的复杂度是 O(n2) 。 题解中提出了空间换时间的算法,把复杂度降到 O(n) 。具体是建立数列的哈希表,建立耗时 O(n) ,索引耗时 O(1) 。我们遍历一遍数组,每个数相对于目标结果,都有一个对应期望的数,即目标结果减去该数。在哈希表索引看在不在里面(注意不能是同一个数,因为不能重复使用),如果在且不是同一个数,则找到了结果。
此外,可以进一步优化,在建立哈希表的同时,遍历数组。

思想核心总结

在一个数列中找一个目标数,普通的遍历耗时 O(n) ,如果是已经有哈希表,则耗时降到 O(1)
在暴力算法中,我们需要多次在一个数列中找目标数,导致嵌套遍历,耗时 O(n2) 。我们可以先用 O(n) 耗时,建立哈希表,使得后面的在一个数列中找目标数变成 O(1) ,一劳永逸,进而优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值