• 1. Two Sum


    Problem:

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.
    You may assume that each input would have exactly one solution, and you may not use the same element twice.

    Example:

    Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
    

    思路1
    利用哈希表。

    1. 首先新建一个哈希表(unordered_map),存储输入数组元素及对应的下标。
    2. 对数组元素进行遍历,对每个值得到其和目标值的差值(dif),在数组中寻找dif,如果存在且下标不重复即得到结果,若遍历后无结果则返回空数组。

    Solution (C++):

    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> num_id;
        for (int i = 0; i < nums.size(); i++) {
            num_id[nums[i]] = i;
        }
    
        for (int i = 0; i < nums.size(); i++) {
            int dif = target - nums[i];
            auto dif_id = num_id.find(dif);
            if (dif_id != num_id.end() && dif_id->second != i) 
                return vector<int>{i, dif_id->second};
        }
        return vector<int>();
    }
    

    性能

    Runtime: 8 ms  Memory Usage: 10.5 MB

    思路2

    对数组排序

    1. 先保存原数组为num,然后对原数组按从小到大进行排序;
    2. 设定2个值begin和end分别作为开始和结束值的下标;
    3. 比较nums[beign]和nums[end]的和sum与target的大小,若sum < target,则说明2数偏小,begin++;若sum > target,则说明两数之和偏大,end--;如果sum = target,则进入4;
    4. 在num中分别查找nums[begin]和nums[end]对应的下标值,并判断2数是否相等,若不相等即是最后的输出。

    Solution (C++):

    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> num, res;
        int n = nums.size();
        num = nums;
        sort(nums.begin(), nums.end());
        
        int begin = 0, end = n - 1;
        while (begin < end) {
            int sum = nums[begin] + nums[end];
            if (sum < target) begin++;
            else if (sum > target) end--;
            else
            {
                for (int i = 0; i < n; i++) {
                    if (num[i] == nums[begin]) {
                        res.push_back(i);
                        break;
                    }
                }
                for (int i = 0; i < n; i++) {
                    if (num[i] == nums[end] && i != res[0]) {
                        res.push_back(i);
                        break;
                    } 
                }
                
                return res;
            }
        }
        return res;
    }
    

    性能

    Runtime: 8 ms  Memory Usage: 9.5 MB

    相关链接如下:

    知乎:littledy

    欢迎关注个人微信公众号:小邓杂谈,扫描下方二维码即可

    作者:littledy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    ectouch第四讲 之缓存文件的生成
    ectouch第三讲之加载调用机制
    Ubuntu 16.04下安装sublime Text的插件
    有关于Git操作(持续更新)
    MongoDB简单查询语句<平时使用语录,持续更新>
    Ruby小白入门笔记之<Rubymine工具的快捷键>
    Ruby小白入门笔记之 <Gemfile 文件>
    Ubuntu 16.04安装、卸载mysql及怎么使用SQL常用操作语句
    Git中.gitignore忽略文件(maven项目)
    Git入门之常用命令(转载阮一峰老师)
  • 原文地址:https://www.cnblogs.com/dysjtu1995/p/11477017.html
Copyright © 2020-2023  润新知