zoukankan      html  css  js  c++  java
  • LeetCode 1.两数之和

    LeetCode 1.两数之和

    https://leetcode-cn.com/problems/two-sum/

    1 暴力枚举

    不管怎样,先把最简单的暴力枚举给安排上。因为题目假定每种输入只会对应一个答案,所以只要搜索到和为target的两个数即可返回它们的下标。

    class Solution {
    public:
        // 时间和空间复杂度:O(N^2), O(N)
        vector<int> twoSum(vector<int>& nums, int target) {
            int sz = nums.size();
            for (int i = 0; i < sz; ++i) {
                for (int j = i + 1; j < sz; ++j) {
                    if (nums[i] + nums[j] == target) {
                        return vector<int>{i, j};
                    }
                }
            }
    
            return vector<int>{-1, -1};
        }
    };
    

    2 两遍哈希

    使用哈希?如果数组中有重复元素怎么办?假如数组为[2, 2, 7, 11],target值为9。由于重复元素的存在,导致有两种答案的出现,不符合题意。所以,要么是数组中不存在重复元素,要么是数组中存在重复元素,但是数组中没有其他数和该重复元素之和为target导致出现两种答案。比如还是上面这个数组,但是target值为18

    class Solution {
    public:
        // 时间和空间复杂度:O(N), O(N)
        vector<int> twoSum(vector<int>& nums, int target) {
            int sz = nums.size();
            unordered_map<int, int> dict;   // <nums[i], i>
            for (int i = 0; i < sz; ++i) {
                dict.insert(make_pair(nums[i], i));
            }
    
            for (int i = 0; i < sz; ++i) {
                auto iter = dict.find(target - nums[i]);
                if (iter != dict.end() && iter->second != i)
                    return vector<int>{i, iter->second};
            }
    
            return vector<int>{-1, -1};
        }
    };
    

    3 一遍哈希

    其实没必要扫描两遍,如果两个数之和为target,则当枚举到后一个数时,前一个数肯定已经在哈希表中了。

    
    class Solution {
    public:
        // 时间和空间复杂度:O(N), O(N)
        vector<int> twoSum(vector<int>& nums, int target) {
            int sz = nums.size();
            unordered_map<int, int> dict;   // <nums[i], i>
    
            for (int i = 0; i < sz; ++i) {
                auto iter = dict.find(target - nums[i]);
                if (iter != dict.end() && iter->second != i)
                    return vector<int>{iter->second, i};
                dict.insert(make_pair(nums[i], i));
            }
    
            return vector<int>{-1, -1};
        }
    }
    
  • 相关阅读:
    MutationObserver DOM变化的观察
    lspci详解分析
    dpdk快速编译使用
    bonding的系统初始化介绍
    fio测试nvme性能
    [驱动] 一个简单内核驱动,通过qemu调试(1)
    qemu启动vm后,如何host上使用ssh连接?
    Linux C下变量和常量的存储的本质
    从计算机中数据类型的存储方式,思考理解原码,反码,补码
    Linux C动态链接库实现一个插件例子
  • 原文地址:https://www.cnblogs.com/wallace-lai/p/13737015.html
Copyright © 2011-2022 走看看