zoukankan      html  css  js  c++  java
  • 1:两数之和(C++)

    题目地址:https://leetcode-cn.com/problems/two-sum/

    题目描述

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

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

    题目示例

    示例:

    给定 nums = [2, 7, 11, 15], target = 9 

    因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]

    解题思路

    思路1:暴力遍历寻找两数之和,时间复杂度O(n^2),空间复杂度O(1);

    思路2:双指针求解,先对数组nums排序,然后使用指针i和j分别指向数组首尾进行遍历求解,时间复杂度O(nlogn),空间复杂度O(n);

    思路3:哈希表求解,根据数组元素的散列值组织成桶以允许通过它们的键值直接快速访问单个元素,遍历数组nums,每次查找target-nums[i]是否存在,时间复杂度O(n),空间复杂度O(n);

    程序源码

    暴力法

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            vector<int> res;
            int len = nums.size();
            for(int i = 0; i < len; i++)
            {
                for(int j = i + 1; j < len; j++)
                {
                    if(nums[i] + nums[j] == target) 
                    {
                        res.push_back(i);
                        res.push_back(j);
                        return res;
                    }
                }
            }
            return res;
        }
    };

    双指针

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            vector<int> res;
            vector<pair<int, int>> nums1;
            for(int i = 0; i < nums.size(); i++)
            {
                nums1.push_back(make_pair(nums[i], i));
            }
            sort(nums1.begin(), nums1.end());
            int i = 0, j = nums1.size() - 1;
            while(i < j)
            {
                if(nums1[i].first + nums1[j].first == target)
                 {  
                     res.push_back(nums1[i].second);
                     res.push_back(nums1[j].second);
                     break;
                 }
                 nums1[i].first + nums1[j].first > target ? --j: ++i;
            }
            return res;
        }
    };

    哈希表

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            //暴力枚举:O(n^2)、O(1)
            /*vector<int> res;
            if(nums.size() < 2) return res;
            for(int i = 0; i < nums.size() - 1; i++)
            {
                for(int j = i + 1; j < nums.size(); j++)
                {
                    if(nums[i] + nums[j] == target) 
                    {
                        res.push_back(i);
                        res.push_back(j);
                    }
                }
            }
            return res;*/
            //哈希表:O(n)、O(n)
            if(nums.size() < 2) return {};
            unordered_map<int, int> mp;
            vector<int> res;
            for(int i = 0; i < nums.size(); i++)
            {
                if(mp[target - nums[i]] != 0 && mp[target - nums[i]] != i + 1) //防止利用同一个元素
                {
                    res.push_back(i);
                    res.push_back(mp[target - nums[i]] - 1);
                    return res;
                }
                mp[nums[i]] = i + 1; //防止处理哈希表下标为零的情况
            }
            return res;
        }
    };
    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            vector<int> res;
            unordered_map<int,int> mp;
            for(int i = 0; i < nums.size(); ++i)
            {
                mp[nums[i]] = i;
            }
            for(int i = 0; i < nums.size(); ++i)
            {
                int index = target - nums[i];
                if(mp.count(index) && mp[index] != i)
                {
                    res.push_back(i);
                    res.push_back(mp[index]);
                    break;
                }
            }
            return res;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    GUI编程
    网络编程
    线程池详解_3
    多线程详解_2
    注解和反射_1
    多线程详解_1
    javaEE简要总结
    MarkDown使用教程简单介绍
    com.sun.xxx.utils不存在问题的解决
    解决npm install安装慢的问题
  • 原文地址:https://www.cnblogs.com/wzw0625/p/13426292.html
Copyright © 2011-2022 走看看