leetcode 1 两数之和

Posted mrwho1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 1 两数之和相关的知识,希望对你有一定的参考价值。

题目

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

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

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

解题思路

1、最简单做法,遍历所有情况,复杂度O(n2)
2、先排序,头尾加两个指针,向中间移动,若指针和小于target,则尾指针前移,若指针和大于target,则头指针后移,复杂度取决于排序算法,最快O(nlogn)
3、不排序,用hash存每个数出现的次数,第一次遍历找出num1,判断条件是target-num1存在且不为同一个num1,如:(3,2,4),target为6,num1为3,target-num1也为3,同一个3就不行。但是如:(3,3),target为6,则num1的3和target-num1的3不为同一个,即可;第二次遍历,找出target-num1的位置,若遇到num1直接跳过,避免重复的情况发生(题目要求同样元素不能重复利用)。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i,len = nums.size();
        map<int, int> mark;
        mark.clear();
        for(i=0; i<len; ++i) {
            mark[nums[i]] ++;
        }
        int le, ri;
        for(i=0; i<len; ++i) {
            mark[nums[i]] --;
            if(mark[target - nums[i]]) {
                le = i;
                break;
            }
            mark[nums[i]] ++;
        }
        for(i=0; i<len; ++i) {
            if(i == le) continue;
            if(nums[i] == target-nums[le]) {
                ri = i;
                break;
            }
        }
        vector<int> v;
        v.push_back(le);
        v.push_back(ri);
        return v;
    }
};



以上是关于leetcode 1 两数之和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1两数之和

LeetCode——1.两数之和

LeetCode第5天 - 283. 移动零 | 167. 两数之和 II - 输入有序数组

LeetCode 两数之和 twoSum

LeetCode:两数之和

leetcode_01两数之和