• 面试题57: 和为s的两个数字(C++)


    题目地址:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/

    题目描述

    输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

    题目示例

    示例 1:

    输入:nums = [2,7,11,15], target = 9
    输出:[2,7] 或者 [7,2]

    示例 2:

    输入:nums = [10,26,30,31,47,60], target = 40
    输出:[10,30] 或者 [30,10]

    解题思路

    方法1:使用哈希表解决,具体思路设置哈希表的key值为nums[i],value值是target - nums[i],然后利用迭代器查找target - nums[i],如果有以target - nums[i]为键值的值,则其值为nums[i],将nums[i]和target - nums[i]装入结果向量arr中,否则将target - nums[i]放进哈希表中。

    方法2:双指针解法,根据题目可知,数组单调递增,所以设置两个指针low和high分别指向数组nums两端,如果两者之和sum大于target,则右指针左移,即high--,否则左指针右移,即low++

    方法3:暴力破解,两层循环解决,但是超时。

    程序源码

    方法1:哈希表

    case1

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            unordered_map<int, int> res;
            vector<int> arr;
            if(nums.size() < 2) return nums;
            for(int i = 0; i < nums.size(); i++)
            {
                res[nums[i]] = 1; //初始化
            }
            for(int i = 0; i < res.size(); i++)
            {
                if(res[target - nums[i]] != 0)
                {
                    arr.push_back(nums[i]);
                    arr.push_back(target - nums[i]);
                    break;
                }
            }
            return arr;
        }
    };

    case2

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            unordered_map<int,int> mp;
            vector<int> arr;
            for(int i = 0; i < (int)nums.size(); i++)
            {
                auto iterator = mp.find(target - nums[i]);
                if(iterator != mp.end())
                {
                    arr.push_back(nums[i]);
                    arr.push_back(target - nums[i]);
                    break;
                }
                else
                mp[nums[i]] = target - nums[i];
            }
            return arr;
        }
    };

    方法2:双指针

    case1——二分法

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            if(nums.size() < 2) return nums;
            int left = 0, right = nums.size() - 1;
            while(left < right) {
                if(nums[left] + nums[right] > target) right--;
                else if(nums[left] + nums[right] < target) left++;
                else
                     return {nums[left], nums[right]};
            }
            return nums;
        }
    };

    case2

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            vector<int> arr;
            if(nums.size() < 2) return nums;
            int low = 0, high = (int)nums.size() - 1;
            int sum = 0;
            while(low < high)
            {
                sum = nums[low] + nums[high];
                if(sum == target)
                {
                    arr.push_back(nums[low]);
                    arr.push_back(nums[high]);
                    break;
                }
                else if(sum > target) high--;
                else
                    low++;
            }
            return arr;
        }
    };

    方法3:暴力(超时)

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

    参考文章:

    https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/solution/ha-xi-biao-fa-c-by-whitetai-bai/

    https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/solution/c-hashtable-wu-shun-xu-rong-qi-shi-xian-cha-zhao-b/

    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    ocx文件转换成C#程序引用的DLL
    CSS颜色代码 颜色值 颜色名字大全(转载)
    WinForm轻松实现自定义分页 (转载)
    如何:使用PicturBox实现类似淘宝网站图片的局部放大功能
    转载jQuery图片放大插件[twiPicZoom]
    LINQ查询返回DataTable类型
    最喜欢的VS 键盘快捷键摘抄
    Codeforces Round #336 (Div. 2)B 暴力 C dp D 区间dp
    Educational Codeforces Round 24 A 水 B stl C 暴力 D stl模拟 E 二分
    poj 1185 状态压缩
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12550425.html
Copyright © 2020-2023  润新知