leetcode解题报告1. Two Sum

来源:互联网 发布:qq播放器官方下载 mac 编辑:程序博客网 时间:2024/05/22 23:36

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
原创粉丝点击