• Sum问题:leetcode 1 两数之和&leetcode15 三数之和


    leetcode 1 两数之和:用哈希

    题目来源:leetcode 1 两数之和

    题目描述:

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

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

    示例:

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

    因为 nums[0] + nums[1] = 2 + 7 = 9

    所以返回 [0, 1]

    解题思路:

    用哈希表保存数组的位置,判断另一个数是否在哈希表中(且不能是当前数)

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            map<int,int> m;
            vector<int> ans;
            for(int i=0;i<nums.size();i++)
                m[nums[i]]=i;
            for(int i=0;i<nums.size();i++){
                auto it=m.find(target-nums[i]);
                if(it!=m.end()&&it->second!=i)
                {
                    ans.push_back(i);
                    ans.push_back(m[target-nums[i]]);
                    return ans;
                }
            }
            return ans;
        }
    };
    

    leetcode15 三数之和:用排序+双指针

    题目来源: leetcode15 三数之和

    题目描述:

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4],

    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

    解题思路:

    先要对数组进行排序,这是后面双指针和去重的基本条件。然后固定第一个数,用双指针找后面两个数。注意相同数字要跳过,以免结果中有重复。

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int>> ans;
            sort(nums.begin(),nums.end());
            for(int i=0;i<nums.size();i++){
                //双指针找结果
                int l=i+1,r=nums.size()-1,target=0-nums[i];
                while(l<r){
                    if(nums[l]+nums[r]>target) r--;
                    else if(nums[l]+nums[r]<target) l++;
                    else {
                        vector<int> temp(3,0);
                        temp[0]=nums[i];
                        temp[1]=nums[l];
                        temp[2]=nums[r];
                        ans.push_back(temp); 
                        while(l<r&&nums[l]==temp[1]) l++;//去重
                        while(l<r&&nums[r]==temp[2]) r--;//去重
                    } 
                }
                while(i+1<nums.size()&&nums[i+1]==nums[i]) i++;//去重
            }
            return ans;
        }
    };
    
  • 相关阅读:
    C++ 根据对象名字创建对象
    Google是如何测试的(一)
    lex yacc 学习
    C语言宏定义时#(井号)和##(双井号)的用法
    更多编译器对C++11的支持比较
    用C++11替代Boost的实验之三
    最先进的开源游戏引擎KlayGE 4.2发布
    各编译器对C++11的支持比较
    在Android模拟器上的一些小陷阱
    推出KlayGE Foundation Library
  • 原文地址:https://www.cnblogs.com/yjcoding/p/13218230.html
Copyright © 2020-2023  润新知